2012-11-07 60 views
0

使用Hibernate 3.3,JPA 1.x和我在與級聯更新到包含其他對象的集合對象的問題HSQLDB 1.8Hibernate的級聯更新到集合對象沒有改變的

。這是一個人爲的(略)示例來說明(省略了getters/setters)。對不起,它有很多代碼,我找不到另一種方式來表達這個問題,它的一切都相當簡單。

@Entity 
public class Salesman 
{ 
    @Id 
    @GeneratedValue 
    @Column(name="salesman_id") 
    private long id; 

    @OneToMany(mappedBy=salesman, targetEntity=ContactSet.class, fetch=FetchType.EAGER, cascade=CascadeType.All) 
    private Set<ContactSet> contacts; 
} 


@Entity 
public class Company 
{ 
    @Id 
    @GeneratedValue 
    @Column(name="company_id") 
    private long id; 

    @Column(name="company_name") 
    private String name; 
} 


@Entity 
public class ContactSet 
{ 
    @Id 
    @GeneratedValue 
    @Column(name="contact_set_id") 
    private long id; 

    @ManyToOne(fetch=FetchType.EAGER) 
    @JoinColumn(name="salesman_id",referencedColumnName="salesman_id", updatable=false, nullable=false) 
    private Salesman salesman 

    @ManyToOne 
    @JoinColumn(name="company_id", referencedColumnName="company_id", updatable=false, nullable=false) 
    private Company company; 

    @OneToMany(mappedBy="contactSet", targetEntity=Contact.class, fetch=FetchType.EAGER, cascade=CascadeType.ALL) 
    private Set<Contact> contacts; 
} 


@Entity 
public class Contact 
{ 
    @Id 
    @GeneratedValue 
    @Column(name="contact_id") 
    private long id; 

    @ManyToOne(fetch=FetchType.EAGER) 
    @JoinColumn(name="contact_set_id",referencedColumnName="contact_set_id", updatable=true, nullable=false) 
    private ContactSet contactSet; 

    @Column(name="contact_name", updatable=false, nullable=false) 
    private String name; 
} 

那麼推銷員有一組爲每個公司的接觸,並且可能有很多業務員該服務的公司,各有不同的聯繫人。我可以將新公司(和相關聯繫人)添加到推銷員,一切都很好。

問題來添加一個新的公司(和聯繫人)到已經有一些推銷員時:

session.beginTransaction(); 
session.lock(salesman, LockMode.NONE) 
ContactSet newSet = new ContactSet(); 
/*...Add contacts to ContactSet...*/ 
salesman.addContactSet(newSet); 
session.saveOrUpdate(salesman); 
session.commit(); 

當hibernate.show_sql運行此= true時,我可以看到這個有預期的效果爲每個聯繫人運行一個Insert,然後插入新的ContactSet。我還看到了推銷員本身的更新,以及有關推銷員所有其他ContactSet和聯繫人的更新。由於每個推銷員有成千上萬的聯繫人,因此此交易需要很長時間。

我的問題是,我如何避免我知道的聯繫人和聯繫人的所有更新沒有更改?我嘗試添加@Version標籤,改變CascadeType(除了ALL之外的所有東西都失敗了),並加載了更多特定的代碼修補,但沒有成功!

預先感謝任何指針,

**編輯:有沒有發現,添加那麼Session.lock(業務員,LockMode.NONE)的交易方式中的其他對象沒有更新,但代碼仍然很慢。我懷疑是因爲它仍然向會話中添加了數千個對象來鎖定它們。更新了示例代碼以反映這一點。 LockMode.NONE只是將分離的對象與會話重新關聯。

菲爾

回答

0

我無法找到一個很好的解決了這一點,所以我結束了在存儲公司的ContactSet以及推銷員以及除去Salesman-> ContactSet所有級聯。現在我只需保存一個新公司,並保存所有新的聯繫人。仍然存在所有銷售員的ContactSets必須更新的情況,並且這隻能通過保存所有銷售員的公司來解決(據我所知)。

如果有人找到更好的解決方案,請添加!