[JAVAWEB实战篇]---Hibernate实现级联删除
Hibernate實現級聯刪除
版權所有,轉載請注明出處zhyiwww@163.com
我的使用背景:
v有新聞和新聞類型,一條新聞只能屬于一個類型,一種新聞類型可以對應多條新聞。
v在數據庫中,新聞受新聞類型外鍵約束,并可以級聯刪除
v在Hibernate中,實現級聯刪除
vjkakfl
(一)創建數據庫表和關系
DROPTABLENewsType;
CREATETABLE NewsType
(
TypeIDNUMBER(10) PRIMARY KEYNOT NULL,
TypeNameVARCHAR2(400) NOT NULL,
DirNameVARCHAR2(400) NOT NULL,
TemplateName VARCHAR2(400) NOT NULL
);
DROPSEQUENCE NEWSTYPE_SEQ;
CREATESEQUENCE NEWSTYPE_SEQINCREMENT BY 1 START WITH 1;
DROPTABLENews;
CREATETABLENews
(
NewsIDNUMBER(10) PRIMARY KEY NOT NULL,
TypeIDNUMBER(10) NOT NULL,
TitleVARCHAR2(400) NOT NULL,
HitCount NUMBER(10) DEFAULT0 NOT NULL,
IssuseDateDATE NOT NULL,
DeployerIDNUMBER(10) NOTNULL,
OriginVARCHAR2(400)NOTNULL,
URLVARCHAR2(400) NOT NULL,
KEYWORDS VARCHAR(400) ,
PriorityNUMBER(10)DEFAULT0 NOT NULL,
SpecialVARCHAR2(400) ,
DescriptionVARCHAR2(400),
AuthorVARCHAR2(400),
TopicVARCHAR2(400)
);
DROP SEQUENCE NEWS_SEQ;
CREATE SEQUENCE NEWS_SEQINCREMENT BY1 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>
<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/>
</set>
<set name="picset" cascade="all" inverse="true" lazy="false" table="Picture">
<key column="newsid"/>
<one-to-many/>
</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/>
</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.在映射文件中要將級聯刪除配置正確
轉載于:https://blog.51cto.com/seasky09/1298985
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的[JAVAWEB实战篇]---Hibernate实现级联删除的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux下使用mail命令发送邮件
- 下一篇: 无人言说【два】