日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[JAVAWEB实战篇]---Hibernate实现级联删除

發布時間:2025/7/14 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [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实现级联删除的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。