2010-06-19 29 views
7

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 ..

Trả lời

4

Oh ... ok

session.refresh(a); 

Công việc này tốt ... Đây là giải pháp, là không đúng?

+1

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 –

6

Khi làm việc với các hiệp hội hai chiều, bạn phải thiết lập các liên kết trên cả bên của hiệp hội:

A a = new A(); 
B b = new B(); 
a.getBList().add(b); 
b.setA(a); 

session.persist(b); 

Và trên thực tế, mô hình chung là thực hiện phương pháp quản lý liên kết phòng thủ như thế này:

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); 
    } 

    //... 
} 

đoạn code Và trở thành:

A a = new A(); 
B b = new B(); 
a.addBToBs(b); 

session.persist(b); 

này được thảo luận trong Hibernate Tutorial:

+0

cảm ơn bạn Pascal – blow

+0

@ blow: Bạn được chào đón. –

+0

cập nhật .......... – blow

Các vấn đề liên quan