(J2EE学习笔记)解决Hibernate删除异常:deleted object would be re-saved by cascade
我們?cè)谥付藬?shù)據(jù)庫(kù)表的關(guān)聯(lián)映射后,在刪除其中一方的的時(shí)候,提示了以下異常:deleted object would be re-saved by cascade (remove deleted object from associations): [entity.Associationinformation#7]
(注:entity.Associationinformation是實(shí)體類,7為設(shè)定的外鍵的值)
下面是我的多對(duì)一關(guān)聯(lián)情況:
1、實(shí)體類:
entity.Associationinformation和entity.Associationactivitylist,前者為one,后者為many。
Associationinformation.java:
public?class?Associationinformation?implements?java.io.Serializable?{ private?Integer?assoId; private?String?assoName; private?String?assoPosition; private?Integer?assoPersonNum; private?String?assoBuildDate; private?String?assoIntroduce; private?String?assoServiceObject; //一對(duì)一的社團(tuán)負(fù)責(zé)人 private?Associationrespeople?assoResID; //一對(duì)多的社團(tuán)活動(dòng) private?Set<Associationactivitylist>?assoActivity; //省略get/set方法 }Associationactivitylist.java:
2、映射文件:*.hbm.xml
Associationinformation.hbm.xml:
<hibernate-mapping><class?name="entity.Associationinformation"?table="associationinformation"?catalog="stu_association"><id?name="assoId"?type="java.lang.Integer"><column?name="AssoID"?/><generator?class="increment"?/></id><property?name="assoName"?type="java.lang.String"><column?name="AssoName"?length="20"?/></property><property?name="assoPosition"?type="java.lang.String"><column?name="AssoPosition"?length="20"?/></property><property?name="assoPersonNum"?type="java.lang.Integer"><column?name="AssoPersonNum"?/></property><property?name="assoBuildDate"?type="java.lang.String"><column?name="AssoBuildDate"?length="10"?/></property><!--??<property?name="assoResName"?type="java.lang.String"><column?name="AssoResName"?length="20"?/></property>--><property?name="assoIntroduce"?type="java.lang.String"><column?name="AssoIntroduce"?length="150"?/></property><property?name="assoServiceObject"?type="java.lang.String"><column?name="AssoServiceObject"?length="20"?/></property><!--?一對(duì)多的社團(tuán)與社團(tuán)活動(dòng)?--><set?name="assoActivity"?table="associationactivitylist"><key?column="assoID"></key><one-to-many?class="entity.Associationactivitylist"/></set><!--?一對(duì)一的社團(tuán)負(fù)責(zé)人?--><many-to-one?name="assoResID"class="entity.Associationrespeople"column="assoResID"lazy="false"cascade="all"unique="true"></many-to-one></class> </hibernate-mapping>Associationactivitylist.hbm.xml:
記得在Hibernate.cfg.xml中聲明映射文件的路徑:
<mapping?resource="entity/Associationinformation.hbm.xml"?/> <mapping?resource="entity/Associationactivitylist.hbm.xml"?/>到這里就完成了一對(duì)多的關(guān)聯(lián)配置,然后在Action中寫Delete()方法:
請(qǐng)注意,這樣寫的話,就會(huì)報(bào)出以上異常,如果沒有關(guān)聯(lián)關(guān)系,這樣寫是可以的。結(jié)合了網(wǎng)上的方法,解決方法如下:
1、刪除Set方的cascade:(缺點(diǎn):子對(duì)象和父對(duì)象不能進(jìn)行級(jí)聯(lián)更新,沒意義)
2、解決關(guān)聯(lián)關(guān)系后,再刪除(個(gè)人推薦):
將Action中的方法改為:
public?String?deleteActivity(){ ... Associationactivitylist?associationactivitylist?=?assoActivityDao.findById(AssoID); Associationinformation?Association?=?associationactivitylist.getAssociation(); Association.getAssoActivity().remove(associationactivitylist); associationactivitylist.setAssociation(null); Transaction?tx?=?HibernateSessionFactory.getSession().beginTransaction(); assoActivityDao.delete(associationactivitylist); tx.commit(); HibernateSessionFactory.closeSession(); ... }分別獲取到社團(tuán)和社團(tuán)活動(dòng)對(duì)象后,利用remove方法解除關(guān)聯(lián)管理,再將one方的值設(shè)為null。
轉(zhuǎn)載于:https://blog.51cto.com/cfdeng/1755553
總結(jié)
以上是生活随笔為你收集整理的(J2EE学习笔记)解决Hibernate删除异常:deleted object would be re-saved by cascade的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RDS最佳实践(三)—如何制定相关的流程
- 下一篇: 合作软件