У меня есть отношения:
// 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
Теперь "проблема":
- a.getId () -> текущий новый идентификатор ОК
- a.getBList () -> по-прежнему нулевой ...
Итак, почему в этом случае bList не обновляется?
Iпопытался перезагрузить после сохранения, таким образом:
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());
Но загруженный A все еще имеет NULL 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
Таким образом, все работает хорошо, но мой вопрос: почему Id корректно обновляется после операции сохранения, а bList нет?Я должен запросить БД с оператором выбора, чтобы перезагрузить экземпляр правильно?
ОБНОВЛЕНИЕ
У меня есть это исключение
StaleStateException: Пакетное обновление вернуло неожиданное количество строк из обновления
, когда я пытаюсь сохранить сущность aOrUpdate a после удаления из нее 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) проблема снова решена ... так, каков правильный путь?Я знаю ... я совершенно нуб с Hibernate ..