tôi có mối quan hệ:danh sách Cập nhật OneToMany sau khi tổ chức tiết kiệm trong Hibernate
// 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;
Bây giờ nhìn này:
A a=new A();
// setting A
B b=new B();
// setting B
b.setA(a);
session.save(b); // this save b and a obviously
Bây giờ "vấn đề":
- a.getId() -> id mới hiện tại OK
- a.getBList() -> vẫn còn null ...
Vì vậy, tại sao bList không được cập nhật trong trường hợp này?
tôi đã cố gắng để tải lại một sau khi lưu, theo cách này:
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());
Nhưng loadedA vẫn có một NULL bList như a.
Đương nhiên để tránh vấn đề này tôi làm theo cách của Chú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
Bằng cách này tất cả hoạt động tốt, nhưng câu hỏi của tôi là: Tại sao Id được một cách chính xác cập nhật sau khi tiết kiệm hoạt động và bList không? Tôi phải truy vấn db với câu lệnh chọn để tải lại một cá thể chính xác?
CẬP NHẬT
Tôi có ngoại lệ này
StaleStateException: hàng loạt cập nhật trở đếm hàng bất ngờ từ cập nhật
khi tôi cố gắng để saveOrUpdate tổ chức một sau xóa b khỏi nó.
// 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
hai hoạt động này không có cùng phương pháp, được kích hoạt bởi sự kiện gui.
session.clear là giải pháp thực sự? Tôi đang làm (có thể) sai?
cập nhật
loại bỏ session.delete (b) các vấn đề được giải quyết một lần nữa ... như vậy, cách corretc là gì? Tôi biết ... im hoàn toàn Noob với Hibernate ..
Blow, đây http://docs.jboss.org/hibernate/core/3.3/reference/en/html/objectstate.html # objectstate-transitive bạn có thể có được một cái nhìn sâu sắc tốt về phương pháp kiên trì nào Để sử dụng khi sử dụng xếp tầng –