??????版權所有,轉載請注明出處zhyiwww@163.com
我的使用背景:
v??????? 有新聞和新聞類型,一條新聞只能屬于一個類型,一種新聞類型可以對應多條新聞。
v??????? 在數據庫中,新聞受新聞類型外鍵約束,并可以級聯刪除
v??????? 在 Hibernate 中,實現級聯刪除
v??????? jkakfl
?
(一) 創建數據庫表和關系
DROP? TABLE? NewsType;
CREATE? TABLE NewsType
(
?????? TypeID? NUMBER(10) PRIMARY KEY? NOT NULL,
?????? TypeName? VARCHAR2(400) NOT NULL,
?????? DirName?? VARCHAR2(400) NOT NULL,
?????? TemplateName VARCHAR2(400) NOT NULL
);
DROP? SEQUENCE NEWSTYPE_SEQ;
CREATE? SEQUENCE NEWSTYPE_SEQ? INCREMENT BY 1 START WITH 1;
?
DROP? TABLE? News;
CREATE? TABLE? News
(
?????? NewsID? NUMBER(10) PRIMARY KEY NOT NULL,
??????? TypeID? NUMBER(10) NOT NULL,
?????? Title? VARCHAR2(400) NOT NULL,
?????? HitCount NUMBER(10) DEFAULT? 0 NOT NULL,
?????? IssuseDate? DATE NOT NULL,
?????? DeployerID? NUMBER(10) NOT? NULL,
?????? Origin? VARCHAR2(400)? NOT? NULL,
?????? URL? VARCHAR2(400) NOT NULL,
?????? KEYWORDS VARCHAR(400) ,
??????? Priority? NUMBER(10)? DEFAULT? 0 NOT NULL,
?????? Special? VARCHAR2(400) ,
?????? Description? VARCHAR2(400),
?????? Author? VARCHAR2(400),
?????? Topic?? VARCHAR2(400)
);
DROP SEQUENCE NEWS_SEQ;
CREATE SEQUENCE NEWS_SEQ? INCREMENT BY? 1 START WITH 1;
?
在 oralce 中,設置數據表的約束關系如下圖:
???
???(二)
實現數據表到
POJO
的映射
映射類,我們略去,此處主要顯示配置文件
ü???????? News.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">
<!-- DO NOT EDIT: This is a generated file that is synchronized -->
<!-- by MyEclipse Hibernate tool integration.?????????????????? -->
<!-- Created Fri Nov 11 21:59:47 CST 2005???????????????????????? -->
<hibernate-mapping package="com.scenechina.vr.model">
?????? <class name="News" table="NEWS" lazy="false">
?????? ?????? <id name="newsid" column="NEWSID" type="java.lang.Long">
?????? ?????? ?????? <generator class="sequence">
?????? ?????? ?????? ?????? <param name="sequence">NEWS_SEQ</param>
?????? ?????? ?????? </generator>
?????? ?????? </id>
?????? ?????? <property name="typeid" column="TYPEID" type="java.lang.Long" not-null="true"/>
?????? ?????? <property name="title" column="TITLE" type="java.lang.String" not-null="true"/>
?????? ?????? <property name="hitcount" column="HITCOUNT" type="java.lang.Long" not-null="true"/>
?????? ?????? <property name="issusedate" column="ISSUSEDATE" type="java.util.Date" not-null="true"/>
?????? ?????? <property name="deployerid" column="DEPLOYERID" type="java.lang.Long" not-null="true"/>
?????? ?????? <property name="origin" column="ORIGIN" type="java.lang.String" not-null="true"/>
?????? ?????? <property name="url" column="URL" type="java.lang.String" not-null="true"/>
?????? ?????? <property name="keywords" column="KEYWORDS" type="java.lang.String"/>
?????? ?????? <property name="priority" column="PRIORITY" type="java.lang.Long" not-null="true"/>
?????? ?????? <property name="special" column="SPECIAL" type="java.lang.String"/>
?????? ?????? <property name="description" column="DESCRIPTION" type="java.lang.String"/>
?????? ?????? <property name="author" column="AUTHOR" type="java.lang.String"/>
?????? ?????? <property name="topic" column="TOPIC" type="java.lang.String"/>
?????? ?????? <set name="newsset" cascade="all" inverse="true" lazy="false" order-by="NEWSDETIALID" table="Newsdetials">
?????? ?????? ?????? <key column="newsid"/>
?????? ?????? ?????? <one-to-many class="Newsdetials"/>
?????? ?????? </set>
?????? ?????? <set name="picset" cascade="all" inverse="true" lazy="false" table="Picture">
?????? ?????? ?????? <key column="newsid"/>
?????? ?????? ?????? <one-to-many class="Picture"/>
?????? ?????? </set>
????? ????? <many-to-one name="newstype" column="TYPEID" entity-name="com.model.Newstype" insert="false" update="false"/>
?????? </class>
</hibernate-mapping>
?
ü???????? Newstype.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
??? "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
?????? <!--
??? Created by the Middlegen Hibernate plugin
?
??? http://boss.bekk.no/boss/middlegen/
??? http://hibernate.sourceforge.net/
-->
?????? <class name="com.scenechina.vr.model.Newstype" table="NEWSTYPE" lazy="false">
?????? ?????? <id name="typeid" type="java.lang.Long" column="TYPEID">
?????? ?????? ?????? <generator class="assigned"/>
?????? ?????? </id>
?????? ?????? <property name="typename" type="java.lang.String" column="TYPENAME" not-null="true" length="100"/>
?????? ?????? <property name="dir" type="java.lang.String" column="DIRNAME" not-null="true" length="100"/>
?????? ?????? <property name="templatename" type="java.lang.String" column="TEMPLATENAME" not-null="true" length="100"/>
?????? ?????? <!-- associations -->
?????
????? <set name="news"
cascade="all-delete-orphan"
inverse="true">
?????
?????
????? <key column="TYPEID"/>
?????
?????
????? <one-to-many class="com.model.News"/>
????? ????? </set>
?????? </class>
</hibernate-mapping>
?
其實這是個雙向以對多關系。
?
(三) 在 DAO 中實現級聯刪除
??????? // 刪除新聞類型記錄
??????? dao.getNewsTypeDAO().deleteObjects(typeIDs);
typeID 是新聞類型的主鍵
執行此操作將會刪除所有此新聞類型的新聞。
news 是一個 Set 類型的變量,用來存放此類型的所有的新聞。
(四) 刪除時遇到的問題
在數據庫中,如果設置了約束關系,那么一定要允許級聯刪除,否則,你在執行刪除時會拋出異常。
如果我們的數據庫關系設置如下:
???畫圈的那個選項沒有選上的話
,那么我們在執行的時候就會拋出如下的異常:
006-04-06 13:20:16 ERROR [http-8080-Processor23] (JDBCExceptionReporter.java:72
?- ORA-02292:
違反完整約束條件
(SC.NEWS_TYPE_RELATIONS) -
已找到子記錄日志
?
rg.hibernate.exception.ConstraintViolationException: could not execute update q
ery
?????? at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.j
va:69)
?????? at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelp
r.java:43)
?????? at org.hibernate.hql.ast.exec.BasicExecutor.execute(BasicExecutor.java:8
)
?
問題的關鍵在如下兩點:
1.??????
數據庫中要允許數據表的級聯刪除
2.??????
在映射文件中要將級聯刪除配置正確
?
?
|----------------------------------------------------------------------------------------|
版權聲明 版權所有 @zhyiwww
引用請注明來源 http://www.aygfsteel.com/zhyiwww
|----------------------------------------------------------------------------------------|