??????版權所有,轉載請注明出處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.tkk7.com/zhyiwww
|----------------------------------------------------------------------------------------|
posted on 2006-04-06 14:12
zhyiwww 閱讀(24613)
評論(6) 編輯 收藏 所屬分類:
j2ee