(J2EE學習筆記)解決Hibernate刪除異常:deleted object would be re-saved by cascade

我們在指定了數據庫表的關聯映射後,在刪除其中一方的的時候,提示了以下異常: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。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章