如果我从父表中删除一条记录,我希望子表中的相应记录被删除。 如何从子表中删除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对象。