当前位置: 首页 > 面试题库 >

休眠单向父/子关系-delete()对子表执行更新,而不是删除

郏正信
2023-03-14
问题内容

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

我正在使用Hibernate 3,但目前无法使用注释。我在下面附上了HBM,DAO等的副本。 - 先感谢您

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

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)

我的表是:

家长

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)
)

儿童:

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>

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);
      }    
}

问题答案:

我遇到这个错误 所有 的时间。

只需在关系上加上一个反向=“ true”,您的问题就会消失!

<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>

基本上相反会告诉hibernate状态,如果没有父项,子项将不存在,从而导致hibernate项删除子项。

话虽如此,您还需要从父级集合中移除charityTransfer对象。



 类似资料:
  • 问题内容: 关于以下与Hibernate有关的问题,我几乎看不到任何指针。这涉及到使用具有自身父子关系的单个数据库表来实现继承。例如: 在这里, managerId 列可以为null,或者可以指向 Employee 表的另一行。业务规则要求员工了解他的所有报告人以及他/她的经理。业务规则还允许行具有为空的 managerId (组织的CEO没有经理)。 我们如何在Hibernate中映射此关系,标

  • 问题内容: 我在Hibernate参考书的第21章中有一个基本的一对多关系父母/子女。 级联仅从子级到父级(持久级联仅是因为删除子级后我不希望删除父级)。 当我向父级添加一个子级并保存该子级时,我有一个TransientObjectException … 但是在saveOrUpdate上,我有以下异常: 我真的不明白,因为拯救孩子应该通过级联来拯救父母……有什么想法吗? 更新1 该问题似乎与“ o

  • 注意:如果我只有一个孩子,我可以删除它,没有任何例外,如果我有2个或更多的孩子,我有一个例外。 谢谢你的帮助!

  • 我有一个场景,需要在一种情况下加载所有子值,在另一种情况下加载一些特定的子值。我对这两种情况都使用一个bean,并使用命名查询编写查询。 现在在我的查询2中,我只需要加载字符串A,而不需要加载字符串B和字符串C。我试过使用 但得到以下错误 那么,关于如何继续这方面的任何建议。。

  • 使用JPA(Hibernate)我试图实现以下关系,并想知道其他人是否对最佳方法有任何建议: 基本上是完全不相关的对象,每个对象都有一个公共子对象的集合;在对象模型中实现简单,在数据库中稍微麻烦些! 我确信这一定是常见的事情,但是我很难找到任何示例实现,因为我真的不知道正确的搜索词。 谢谢你的时间!

  • 我的实体更新有问题。如你所见,我有三个实体。 包含类中的列表。 包含类中的列表。 从我的SQL语句中可以看到,字段和是唯一的。我的表中只允许该组合的一行。 当我用类的新列表更新父实体()时,我希望Hibernate删除旧列表本身并创建新实体。一个一个地更新孩子是有点困难的。这就是为什么我要直接删除所有相关的孩子。 当我更新并为其提供包含具有唯一名称的和(数据库中已存在的实体)组合的列表时,我会出现