у меня есть отношения:
// In A.java class
@OneToMany(mappedBy="a", fetch=FetchType.LAZY)
@Cascade(CascadeType.SAVE_UPDATE)
private List<B> bList;
// In B.java class
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="id_a")
@Cascade(CascadeType.SAVE_UPDATE)
private A a;
Теперь посмотрите это:
A a=new A();
// setting A
B b=new B();
// setting B
b.setA(a);
session.save(b); // this save b and a obviously
Теперь "проблема":
Так, почему bList не является обновлением в этом случае?
Я пытался перезагрузить после того, как сохраняют, таким образом:
A a=new A();
// setting A
B b=new B();
// setting B
b.setA(a);
session.save(b);
A loadedA=(A)session.get(A, a.getId());
Но loadedA все еще имеют ПУСТОЙ УКАЗАТЕЛЬ bList как a.
Естественно для предотвращения этой проблемы я делаю в вашем пути:
A a=new A();
// setting A
B b=new B();
// setting B
List<B> bList=new ArrayList<B>();
bList.add(b);
a.setBList(bList);
session.save(a); // this save a and b
Таким образом вся хорошая работа, но мой вопрос: Почему идентификатор является правильно обновлением после того, как сохранят операцию и bList нет? Я должен запросить дб с избранным оператором для перезагрузки экземпляра правильно?
ОБНОВЛЕНИЕ
У меня есть это исключение
StaleStateException: Пакетное обновление возвратило неожиданное количество строки из обновления
когда я пробую к saveOrUpdate объекту после удаления b от него.
// first delete old b record
Session session=HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
a.getBList().remove(b);
b.setA(null);
session.delete(b);
// session.clear(); // this would solve my problem, but is it correct??
session.getTransaction().commit();
// then insert new b record
Session session=HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
B b=new B();
a.getBList().add(b);
b.setA(a);
session.saveOrUpdate(a);
session.getTransaction().commit(); // this throw exception
эти две операции не находятся в том же методе, конечно, запущены gui событием.
session.clear является действительным решением? Я делаю (вероятно), неправильно?
обновление
удаление session.delete (b) проблема решено снова... так, каков corretc путь? Я знаю... im полностью, новичок с в спящем режиме..
Oh... ok
session.refresh(a);
Это хорошо работает... это решение, не так ли?
При работе с двунаправленными ассоциациями вам нужно установить связь на обеих сторонах ассоциации:
A a = new A();
B b = new B();
a.getBList().add(b);
b.setA(a);
session.persist(b);
И на самом деле, общий шаблон заключается в реализации защитных методов управления связями вот так:
public class A {
@OneToMany(mappedBy="a", fetch=FetchType.LAZY)
@Cascade(CascadeType.SAVE_UPDATE)
private List<B> bList = new ArrayList<B>();
protected List<B> getListB() {
return bList;
}
protected void setListB(List bList) {
this.bList = bList;
}
public void addBToBs(B b) {
bList.add(b);
b.setA(this);
}
//...
}
И код становится:
A a = new A();
B b = new B();
a.addBToBs(b);
session.persist(b);
Это обсуждается в учебнике Hibernate: