對Hibernate的cascade解釋
Hibernate中onetomany hibernate設(shè)置cascade="all"的話,那么在進行聯(lián)機操作的時候,如果把一端設(shè)置成inverse="false",比如one的一方,那么many一方的與one一方失去關(guān)聯(lián)關(guān)系的數(shù)據(jù)不會被刪除掉,而是將關(guān)聯(lián)外鍵設(shè)置為null,出現(xiàn)了孤立的數(shù)據(jù)!解決辦法就是設(shè)置 cascade="all-delete-orphan"。然而這種簡單的設(shè)置,會出現(xiàn)問題。
org.springframework.orm.hibernate3.HibernateSystemException: A collection with cascade="all-delete-orphan" was no longer referenced by the owning entity instance: xxx.Aaa.bbbList; nested exception is org.hibernate.HibernateException: A collection with cascade="all-delete-orphan" was no longer referenced by the owning entity instance: xxx.Aaa.bbbList
Caused by: org.hibernate.HibernateException: A collection with cascade="all-delete-orphan" was no longer referenced by the owning entity instance: xxx.Aaa.bbbList
參考了論壇中的一些關(guān)于Hibernae中cascade的帖子,知道如下辦法可以解決:
1 在實體中把setBbbList方法設(shè)置成私有private
2 在實體中增加如下方法:
public void addBbbList(Bbb b) {
getBbbList().add(b);
b.setAaa(this);
}
3 設(shè)置cascade="all-delete-orphan"
4 在dao中
DAO dao= (DAO) BeanFactory.getBean("dao");
Aaa a = dao.getAaaById(id);
a.getBbbList().clear();
a.addBbbList(b1);
a.addBbbList(b2);
a.addBbbList(b3);
dao.update(a);
這樣與a關(guān)聯(lián)的b1 b2 b3會同步到數(shù)據(jù)庫,之前與a關(guān)聯(lián)的子表數(shù)據(jù)將會被自動刪除。
【編輯推薦】