Hibernate单向父/子关系 - delete()在子表上执行更新而不是删除 [英] Hibernate Unidirectional Parent/Child relationship - delete() performs update on child table instead of delete

查看:103
本文介绍了Hibernate单向父/子关系 - delete()在子表上执行更新而不是删除的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如果我从父表中删除一条记录,我希望子表中的相应记录被删除。如何从Child表中删除Hibernate而不是尝试用null更新?



我使用Hibernate 3但不能在这个时候使用注释。我在下面附上了HBM,DAO等的副本。 - 预先感谢您



试图从父/子关系中删除表中的数据时,出现以下错误:

  Testcase:testDelete(com.dressbarn.imbo.model.data.hibernate.dao.CharityTransferDAOTest):导致错误
Hibernate flush:无法执行JDBC批量更新;未分类用于SQL的SQLException [更新RMS12.DRS_CHARITY_TRANSFER_ITEM set TSF_NO = null,TSF_SEQ_NO = null where TSF_NO =?]; SQL状态[72000];错误代码[1407]; ORA-01407:无法更新(RMS12,DRS_CHARITY_TRANSFER_ITEM,TSF_NO)为NULL
;嵌套异常是java.sql.BatchUpdateException:ORA-01407:无法更新(RMS12。DRS_CHARITY_TRANSFER_ITEM。TSF_NO)为NULL

org.springframework.jdbc.UncategorizedSQLException:Hibernate flush:Could不执行JDBC批量更新;未分类用于SQL的SQLException [更新RMS12.DRS_CHARITY_TRANSFER_ITEM set TSF_NO = null,TSF_SEQ_NO = null where TSF_NO =?]; SQL状态[72000];错误代码[1407]; ORA-01407:无法更新(RMS12,DRS_CHARITY_TRANSFER_ITEM,TSF_NO)为NULL
;嵌套异常是java.sql.BatchUpdateException:ORA-01407:无法更新(RMS12。DRS_CHARITY_TRANSFER_ITEM。TSF_NO)为NULL

由java.sql.BatchUpdateException引发:ORA-01407 :在oracle上oracle.jdbc.driver.DatabaseError.throwBatchUpdateException(DatabaseError.java:498)
无法更新(RMS12,DRS_CHARITY_TRANSFER_ITEM,TSF_NO)为NULL

。 jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:12368)
在org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
在org.hibernate.jdbc.AbstractBatcher.executeBatch( AbstractBatcher.java:246)
在org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:237)
在org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:143)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
at org.hibernate.event.def.De (org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:578)
在org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:662)
在org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:632)
在org.springframework .Transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:314)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor。的java:116)$在org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171 B $ B)
。在org.springframework.aop.framework.Cglib2AopProxy $ DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java: 629)
at com.dressbarn.imbo.model.data.hibernate.dao.CharityTransferDAO $$ EnhancerByCGLIB $$ 6a21cd58.delete(< generated>)
at com.dressbarn.imbo.model.data .hibernate.dao.CharityTransferDAOTest.testDelete(CharityTransferDAOTest.java:112)
at org.springframework.test.ConditionalTestCase.runBare(ConditionalTestCase.java:69)

我的表格为:





  CREATE TABLE DRS_CHARITY_TRANSFER 

TSF_NO NUMBER(10)NOT NULL主键,
FROM_LOC NUMBER(10),
CHARITY_LOC_ID NUMBER(10),
STATUS VARCHAR2(1 CHAR),
CREATE_DATE DATE,
EXT _REF_NO VARCHAR2(30 CHAR),
COMMENT_DESC VARCHAR2(2000 CHAR),
USER_ID VARCHAR2(30 CHAR)

Child:
$ b

  CREATE TABLE DRS_CHARITY_TRANSFER_ITEM 

TSF_NO NUMBER(10)NOT NULL PRIMARY KEY,
ITEM VARCHAR2(25 BYTE)NOT NULL PRIMARY KEY,
TSF_SEQ_NO INTEGER,
TSF_QTY INTEGER

HBM XML

 < hibernate-mapping package =com.dressbarn.imbo.model.data.hibernate.transferschema =RMS12> 
< class name =CharityTransfertable =DRS_CHARITY_TRANSFER>
< id name =transferNumbercolumn =TSF_NOunsaved-value =undefined>

< / id>
< property column =FROM_LOClength =10name =fromLocationtype =java.lang.Long/>
< property column =CHARITY_LOC_IDlength =10name =toCharityLocIdtype =java.lang.Long/>
< property column =STATUSname =statustype =string/>
< property column =EXT_REF_NOname =documentNumbertype =string/>
< property column =COMMENT_DESCname =commenttype =string/>
< property column =CREATE_DATEname =createDatetype =string/>
< property column =USER_IDname =userIdtype =string/>
< list name =charityTransferItemListcascade =all-delete-orphanlazy =false>
< key column =TSF_NO/>
< list-index column =TSF_SEQ_NO/>
<一对多课程=CharityTransferItem/>
< / list>
< / class>

< class name =CharityTransferItemtable =DRS_CHARITY_TRANSFER_ITEM>
< id name =itemcolumn =TSF_NOunsaved-value =undefined>

< / id>
< property column =ITEMname =itemtype =string/>
< / class>

DAO

< pre $ public $ {code> public class CharityTransferDAO extends HibernateDaoSupport implements ICharityTransfer {
$ b $ public void delete(CharityTransfer charityTransfer)throws IMADataException {
try {
getSessionFactory()
.getCurrentSession()
.delete(charityTransfer);

catch(HibernateException e){
抛出新的IMADataException(未能删除慈善运送信息,e);
}
}


解决方案

I遇到这个错误所有时间。



只需在关系上设置inverse =true,问题就会消失!

 < list name =charityTransferItemListinverse =truecascade =all-delete-orphanlazy =false> 
< key column =TSF_NO/>
< list-index column =TSF_SEQ_NO/>
<一对多课程=CharityTransferItem/>
< / list>

基本上,反向会告诉hibernate,如果没有父亲,hibernate就不能存在,从而导致hibernate删除孩子。
$ b 话虽如此,您还需要从父级集合中删除charityTransfer对象。


If I delete a record from the Parent table I want the corresponding records in the child table to be deleted. How can I make Hibernate delete from the Child table rather than attempt to update with a null?

I'm using Hibernate 3 but cannot use annotations at this time. I've attached copies of HBM, DAO etc below. -- Thank you in Advance

When attempting to delete data from tables in Parent/Child relationship I get the following error:

Testcase: testDelete(com.dressbarn.imbo.model.data.hibernate.dao.CharityTransferDAOTest):        Caused an ERROR
Hibernate flushing: Could not execute JDBC batch update; uncategorized SQLException for SQL [update RMS12.DRS_CHARITY_TRANSFER_ITEM set TSF_NO=null, TSF_SEQ_NO=null where TSF_NO=?]; SQL state [72000]; error code [1407]; ORA-01407: cannot update ("RMS12"."DRS_CHARITY_TRANSFER_ITEM"."TSF_NO") to NULL
; nested exception is java.sql.BatchUpdateException: ORA-01407: cannot update ("RMS12"."DRS_CHARITY_TRANSFER_ITEM"."TSF_NO") to NULL

org.springframework.jdbc.UncategorizedSQLException: Hibernate flushing: Could not execute JDBC batch update; uncategorized SQLException for SQL [update RMS12.DRS_CHARITY_TRANSFER_ITEM set TSF_NO=null, TSF_SEQ_NO=null where TSF_NO=?]; SQL state [72000]; error code [1407]; ORA-01407: cannot update ("RMS12"."DRS_CHARITY_TRANSFER_ITEM"."TSF_NO") to NULL
; nested exception is java.sql.BatchUpdateException: ORA-01407: cannot update ("RMS12"."DRS_CHARITY_TRANSFER_ITEM"."TSF_NO") to NULL

Caused by: java.sql.BatchUpdateException: ORA-01407: cannot update ("RMS12"."DRS_CHARITY_TRANSFER_ITEM"."TSF_NO") to NULL

        at oracle.jdbc.driver.DatabaseError.throwBatchUpdateException(DatabaseError.java:498)
        at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:12368)
        at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
        at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:246)
        at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:237)
        at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:143)
        at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
        at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
        at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
        at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
        at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
        at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:578)
        at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:662)
        at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:632)
        at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:314)
        at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:116)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
        at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:629)
        at com.dressbarn.imbo.model.data.hibernate.dao.CharityTransferDAO$$EnhancerByCGLIB$$6a21cd58.delete(<generated>)
        at com.dressbarn.imbo.model.data.hibernate.dao.CharityTransferDAOTest.testDelete(CharityTransferDAOTest.java:112)
        at org.springframework.test.ConditionalTestCase.runBare(ConditionalTestCase.java:69)

My tables are:

Parent:

CREATE TABLE DRS_CHARITY_TRANSFER
(
  TSF_NO          NUMBER(10)                    NOT NULL Primary Key,
  FROM_LOC        NUMBER(10),
  CHARITY_LOC_ID  NUMBER(10),
  STATUS          VARCHAR2(1 CHAR),
  CREATE_DATE     DATE,
  EXT_REF_NO      VARCHAR2(30 CHAR),
  COMMENT_DESC    VARCHAR2(2000 CHAR),
  USER_ID         VARCHAR2(30 CHAR)
)

Child:

CREATE TABLE DRS_CHARITY_TRANSFER_ITEM
 (
  TSF_NO      NUMBER(10)  NOT NULL PRIMARY KEY,
  ITEM        VARCHAR2(25 BYTE)  NOT NULL PRIMARY KEY,
  TSF_SEQ_NO  INTEGER,
  TSF_QTY     INTEGER
)

HBM XML

<hibernate-mapping package="com.dressbarn.imbo.model.data.hibernate.transfer" schema="RMS12">
   <class name="CharityTransfer" table="DRS_CHARITY_TRANSFER">
       <id name="transferNumber" column="TSF_NO" unsaved-value="undefined">

       </id>
       <property column="FROM_LOC" length="10" name="fromLocation" type="java.lang.Long"/>
       <property column="CHARITY_LOC_ID" length="10" name="toCharityLocId" type="java.lang.Long"/>
       <property column="STATUS" name="status" type="string"/>
       <property column="EXT_REF_NO" name="documentNumber" type="string"/>
       <property column="COMMENT_DESC" name="comment" type="string"/>
       <property column="CREATE_DATE" name="createDate" type="string"/>
       <property column="USER_ID" name="userId" type="string"/>
    <list name="charityTransferItemList" cascade="all-delete-orphan" lazy="false">
        <key column="TSF_NO" />
        <list-index column="TSF_SEQ_NO"/>
        <one-to-many class="CharityTransferItem" />
    </list>
</class>

<class name="CharityTransferItem" table="DRS_CHARITY_TRANSFER_ITEM">
    <id name="item" column="TSF_NO" unsaved-value="undefined">

    </id>
    <property column="ITEM" name="item" type="string"/>
    <property column="TSF_SEQ_NO" length="10" name="sequence" type="integer"/>
    <property column="TSF_QTY" length="12" name="quantity" type="long"/>
</class>

DAO

public class CharityTransferDAO extends HibernateDaoSupport implements ICharityTransfer {

   public void delete(CharityTransfer charityTransfer) throws IMADataException {
       try {
         getSessionFactory()
                 .getCurrentSession()
                 .delete(charityTransfer);
      }
      catch (HibernateException e) {
        throw new IMADataException("failed to delete charity shipping information", e);
      }    
}

解决方案

I encountered this error all the time.

Just put an inverse="true" on the relationship and your problem will go away!

<list name="charityTransferItemList" inverse="true" cascade="all-delete-orphan" lazy="false" >
        <key column="TSF_NO" />
        <list-index column="TSF_SEQ_NO"/>
        <one-to-many class="CharityTransferItem" />
    </list>

Basically the inverse will tell hibernate the child cannot exist without a parent, thereby causing hibernate to delete the child.

Having said that, you'll also need to remove the charityTransfer object from the collection in the parent as well.

这篇关于Hibernate单向父/子关系 - delete()在子表上执行更新而不是删除的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆