hibernate的單向級(jí)聯(lián)刪除問題
Posted on 2010-10-06 18:38 石子路口 閱讀(2692) 評(píng)論(3) 編輯 收藏 所屬分類: 網(wǎng)絡(luò)教學(xué)資源平臺(tái) 對于兩個(gè)不同的表,在hibernate中可以設(shè)置它們的多對多關(guān)系,一對一關(guān)系或者是多對一關(guān)系。而且還有單向和雙向的問題。這些都是學(xué)hibernate必學(xué)的,這里不再重復(fù)。我只說下級(jí)聯(lián)刪除時(shí)應(yīng)注意的問題,多對一單向關(guān)系到底能不能實(shí)現(xiàn)級(jí)聯(lián)?
假設(shè)存在兩個(gè)表:欄目(lm)表,內(nèi)容(mknr)表;它們屬于多對一的關(guān)系,即欄目可以包括多個(gè)內(nèi)容。則有以下方式:
欄目表對應(yīng)的pojo類:Lm.java
public class Lm implements java.io.Serializable
{
//欄目id
private int id;
private String name;
private Set mknr = new HashSet();

//getter和setter方法

}
欄目表對應(yīng)的映射文件:Lm.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class catalog="eteares" name="cn.edu.ujn.wsjx.model.Lm" table="lm">
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="identity" />
</id>
<property name="name" type="java.lang.String">
<column length="20" name="name" />
<set name="mknr" inverse="false" cascade="all">
<key column="lmId" />
<one-to-many class="cn.edu.ujn.wsjx.model.Mknr"/>
</set>
</class>
</hibernate-mapping>
內(nèi)容表對應(yīng)的pojo類:Mknr.java
public class Mknr implements java.io.Serializable
{
private int id;
private String title;
private String content;
private Lm lm;
//getter和setter方法

}
內(nèi)容表對應(yīng)的映射文件:Mknr.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
<class name="cn.edu.ujn.wsjx.model.Mknr" table="mknr" catalog="eteares">
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="identity" />
</id>
<property name="title" type="java.lang.String">
<column name="title" length="100" />
</property>
<property name="content" type="java.lang.String">
<column name="content" length="16777215" />
</property>
<many-to-one name="lm" class="cn.edu.ujn.wsjx.model.Lm" lazy="false">
<column name="lmId" />
</many-to-one>
</class>
</hibernate-mapping>
從上面的代碼可以得知,這種設(shè)置方式屬于一對多雙向關(guān)聯(lián),為什么不設(shè)置成多對一單向關(guān)聯(lián)呢(把Lm.java中的mknr屬性去掉),之前我就是這么設(shè)置,但每當(dāng)刪除lm中的記錄時(shí),刪除就會(huì)出現(xiàn)外鍵參考的錯(cuò)誤,這是因?yàn)閙knr中有記錄外鍵到了lm表中,而刪除時(shí)因?yàn)閱蜗蜿P(guān)聯(lián)無法通過lm找到mknr
所以要使用級(jí)聯(lián)刪除,就要設(shè)置成雙向關(guān)聯(lián)!
假設(shè)存在兩個(gè)表:欄目(lm)表,內(nèi)容(mknr)表;它們屬于多對一的關(guān)系,即欄目可以包括多個(gè)內(nèi)容。則有以下方式:
欄目表對應(yīng)的pojo類:Lm.java



























































從上面的代碼可以得知,這種設(shè)置方式屬于一對多雙向關(guān)聯(lián),為什么不設(shè)置成多對一單向關(guān)聯(lián)呢(把Lm.java中的mknr屬性去掉),之前我就是這么設(shè)置,但每當(dāng)刪除lm中的記錄時(shí),刪除就會(huì)出現(xiàn)外鍵參考的錯(cuò)誤,這是因?yàn)閙knr中有記錄外鍵到了lm表中,而刪除時(shí)因?yàn)閱蜗蜿P(guān)聯(lián)無法通過lm找到mknr
所以要使用級(jí)聯(lián)刪除,就要設(shè)置成雙向關(guān)聯(lián)!