我們在指定了數據庫表的關聯映射後,在刪除其中一方的的時候,提示了以下異常:deleted object would be re-saved by cascade (remove deleted object from associations): [entity.Associationinformation#7]
(注:entity.Associationinformation是實體類,7爲設定的外鍵的值)
下面是我的多對一關聯情況:
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:
public class Associationactivitylist implements java.io.Serializable { private Integer activityId; private String activityName; private String activityPosition; private Integer activityPersonNum; private String activityTime; private String activityContent; private Associationinformation association; //省略get/set方法 }
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-mapping> <class name="entity.Associationactivitylist" table="associationactivitylist" catalog="stu_association"> <id name="activityId" type="java.lang.Integer"> <column name="ActivityID" /> <generator class="increment" /> </id> <property name="activityName" type="java.lang.String"> <column name="ActivityName" length="20" not-null="true" /> </property> <property name="activityPosition" type="java.lang.String"> <column name="ActivityPosition" length="20" not-null="true" /> </property> <property name="activityPersonNum" type="java.lang.Integer"> <column name="ActivityPersonNum" /> </property> <property name="activityTime" type="java.lang.String"> <column name="ActivityTime" length="10" not-null="true" /> </property> <property name="activityContent" type="java.lang.String"> <column name="ActivityContent" length="150" /> </property> <!-- 配置多對一關聯關係 --> <many-to-one name="association" class="entity.Associationinformation" column="assoID" cascade="all"> </many-to-one> </class> </hibernate-mapping>
記得在Hibernate.cfg.xml中聲明映射文件的路徑:
<mapping resource="entity/Associationinformation.hbm.xml" /> <mapping resource="entity/Associationactivitylist.hbm.xml" />
到這裏就完成了一對多的關聯配置,然後在Action中寫Delete()方法:
public String deleteActivity(){ ... Transaction tx = HibernateSessionFactory.getSession().beginTransaction(); assoActivityDao.delete(associationactivitylist); tx.commit(); HibernateSessionFactory.closeSession(); ... }
請注意,這樣寫的話,就會報出以上異常,如果沒有關聯關係,這樣寫是可以的。結合了網上的方法,解決方法如下:
1、刪除Set方的cascade:(缺點:子對象和父對象不能進行級聯更新,沒意義)
2、解決關聯關係後,再刪除(個人推薦):
將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方法解除關聯管理,再將one方的值設爲null。