(J2EE学习笔记)解决Hibernate删除异常:deleted object would be re-saved by cascade
我們在指定了數(shù)據庫表的關聯(lián)映射后,在刪除其中一方的的時候,提示了以下異常:deleted object would be re-saved by cascade (remove deleted object from associations): [entity.Associationinformation#7]
(注:entity.Associationinformation是實體類,7為設定的外鍵的值)
下面是我的多對一關聯(lián)情況:
1、實體類:
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; //一對一的社團負責人 private?Associationrespeople?assoResID; //一對多的社團活動 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><!--?一對多的社團與社團活動?--><set?name="assoActivity"?table="associationactivitylist"><key?column="assoID"></key><one-to-many?class="entity.Associationactivitylist"/></set><!--?一對一的社團負責人?--><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"?/>到這里就完成了一對多的關聯(lián)配置,然后在Action中寫Delete()方法:
請注意,這樣寫的話,就會報出以上異常,如果沒有關聯(lián)關系,這樣寫是可以的。結合了網上的方法,解決方法如下:
1、刪除Set方的cascade:(缺點:子對象和父對象不能進行級聯(lián)更新,沒意義)
2、解決關聯(lián)關系后,再刪除(個人推薦):
將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(); ... }分別獲取到社團和社團活動對象后,利用remove方法解除關聯(lián)管理,再將one方的值設為null。
轉載于:https://blog.51cto.com/cfdeng/1755553
總結
以上是生活随笔為你收集整理的(J2EE学习笔记)解决Hibernate删除异常:deleted object would be re-saved by cascade的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RDS最佳实践(三)—如何制定相关的流程
- 下一篇: 12种超酷HTML5 SVG和CSS3浮