生活随笔
收集整理的這篇文章主要介紹了
hibernate 级联删除
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
配置文件和pojo類如下:
?
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="com.hotel.dao.Movietype"?table="movietype"?catalog="hotelfidelio">??????????<id?name="id"?type="java.lang.Integer">??????????????<column?name="id"?/>??????????????<generator?class="native"></generator>??????????</id>??????????<property?name="name"?type="java.lang.String">??????????????<column?name="name"?length="60"?not-null="true"?/>??????????</property>??????????<property?name="field1"?type="java.lang.String">??????????????<column?name="field1"?length="20"?/>??????????</property>??????????<set?name="movies"?????????????table="movie"????????????inverse="true"????????????lazy="false"????????????cascade="all">???????????<key?column="id_movietype"></key>???????????<one-to-many?class="com.hotel.dao.Movie"/>??????????</set>??????</class>??</hibernate-mapping>???
?
?
?
?
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="com.hotel.dao.Movie"?table="movie"?catalog="hotelfidelio">??????????<id?name="id"?type="java.lang.Integer">??????????????<column?name="id"?/>??????????????<generator?class="native"></generator>??????????</id>??????????<property?name="moviename"?type="java.lang.String">??????????????<column?name="moviename"?length="200"?not-null="true"?/>??????????</property>??????????<property?name="movienameSys"?type="java.lang.String">??????????????<column?name="moviename_sys"?length="300"?not-null="true"?unique="true"?/>??????????</property>??????????<property?name="director"?type="java.lang.String">??????????????<column?name="director"?length="200"?/>??????????</property>??????????<property?name="impersonator"?type="java.lang.String">??????????????<column?name="impersonator"?length="200"?/>??????????</property>??????????<property?name="charge"?type="java.lang.Double">??????????????<column?name="charge"?precision="22"?scale="0"?not-null="true"?/>??????????</property>??????????<property?name="intro"?type="java.lang.String">??????????????<column?name="intro"?length="16277215"?/>??????????</property>??????????<property?name="imgsrc"?type="java.lang.String">??????????????<column?name="imgsrc"?length="300"?/>??????????</property>??????????<property?name="field1"?type="java.lang.String">??????????????<column?name="field1"?length="20"?/>??????????</property>??????????<property?name="field2"?type="java.lang.String">??????????????<column?name="field2"?length="20"?/>??????????</property>??????<property?name="idmovietype"?type="java.lang.Integer">??????????<column?name="id_movietype"?precision="3"?scale="0"?not-null="true"?/>??????</property>??????<many-to-one????????????name="movietype"???????????class="com.hotel.dao.Movietype"???????????column="id_movietype"???????????insert="false"???????????update="false"???????????????outer-join="auto"???????????fetch="select"???????????????access="property"???????????????not-null="true"???????????????lazy="false"???????????>??????</many-to-one>??????</class>??</hibernate-mapping>???
?
網上很多帖子都說cascade="all" 就可以級聯刪除,但是我這里怎么設置都沒法成功,觀察輸出日志
只有 ?movietype的刪除 sql:
?
Hibernate:?delete from hotel.movietype where id=??
?
之后看到?arthur.3726?文章:http://arthur-3726.javaeye.com/blog/422877?發現只有用hibernate自帶的事物執行語句才能執行級聯刪除,覺得有可能不是配置文件的問題,而是java代碼的問題:
?
Eclipse配置完ssh后,自動生成的代碼:
?
?
Java代碼?
public?void?delete(Movietype?persistentInstance)?{??????log.debug("deleting?Movietype?instance");??????try?{??????????getHibernateTemplate().delete(persistentInstance);??????????log.debug("delete?successful");??????}?catch?(RuntimeException?re)?{??????????log.error("delete?failed",?re);??????????throw?re;??????}??}???
?
改成直接由hibernate的session來執行:
?
?
Java代碼?
public?void?delete_cascade(final?Movietype?persistentInstance)?{??????log.debug("deleting?Movietype?instance");??????try?{??????????getHibernateTemplate().executeFind(new?HibernateCallback()?{??????????????public?Object?doInHibernate(Session?s)??????????????????????throws?HibernateException,?SQLException?{??????????????????s.setFlushMode(FlushMode.AUTO);??????????????????s.beginTransaction().begin();??????????????????s.delete(persistentInstance);??????????????????s.beginTransaction().commit();??????????????????s.close();??????????????????return?null;??????????????}??????????});??????}?catch?(RuntimeException?re)?{??????????log.error("find?all?failed",?re);??????????throw?re;??????}??}???
?測試刪除movietype,輸出sql語句:
?
Hibernate: delete from hotelfidelio.movie where id=?
Hibernate: delete from hotelfidelio.movietype where id=?
?
刪除成功。
?
參考:http://arthur-3726.javaeye.com/blog/422877
?? ? ? ??http://docs.jboss.org/hibernate/stable/core/reference/en/html_single/#objectstate-transitive
?? ? ? ??http://docs.jboss.org/hibernate/stable/core/reference/en/html/objectstate.html#objectstate-transitive
?? ? ? ??http://docs.jboss.org/hibernate/stable/core/reference/en/html/example-parentchild.html
總結
以上是生活随笔為你收集整理的hibernate 级联删除的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。