使用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只是將分離的對象與會話重新關聯。
菲爾