2009-06-18 3 views
8

부모 테이블에서 레코드를 삭제하면 자식 테이블의 해당 레코드가 삭제되기를 원합니다. 널 (null)로 갱신하지 않고 Hibernate를 Child 테이블에서 h 제할 수있는 f}은 무엇입니까?Hibernate 단방향 부모/자식 관계 - 삭제 대신 자식 테이블에서 delete()가 수행됩니다.

나는 최대 절전 모드 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> 

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

답변

11

는이 오류 모든 시간을 발생했습니다.

관계에 inverse = "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> 

는 기본적으로 반대하여 아이를 삭제 최대 절전 모드의 원인, 부모 없이는 존재할 수 없습니다 아이를 최대 절전 모드 말할 ​​것이다.

그렇다면 부모의 컬렉션에서 charityTransfer 객체도 제거해야합니다.

+0

저는 역관계가 양방향 관계에만 관련이 있다고 생각했습니다. 즉, 관계의 어느 쪽이 "왕"으로 간주되어야 하는지를 Hibernate에게 알려줍니다. 나는 틀린가? – waxwing

+0

마이크, 감사합니다. 그것은 트릭을했다. 마크 –

+1

나는 inverse = "true"를 기본값으로 만들고, 제거할지 여부를 고려하는 습관을 제안합니다.나는 inverse = "true"를 넣지 않아도되는 횟수를 한 손으로 생각할 수 있다고 생각한다. –

1

(참고 : 이는 두 명의 사용자가 잘못된 대답으로 제기했습니다.)

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

Hibernate doc on collections에서 :

최대 절전 모드 문서는 not-null="true"로 키 열 표시 단지 수 있다고 나는 또한 당신의 캐스케이드 스타일에 오타가 있다고 생각

If the foreign key column of a association is declared NOT NULL, you must declare the mapping not-null="true" or use a bidirectional association with the collection mapping marked inverse="true". See the discussion of bidirectional associations later in this chapter for more information.

을 (all-delete-orphan이 있어야한다 all,delete-orphan).

+0

'not-null = true' 또는'nullable = false' 주석은 이것을 제어하지 않습니다. 직접 테스트했습니다. 이것은 'inverse = true' 또는'mappedBy = "fieldName"속성에 의해 독점적으로 제어됩니다. – Shinzul

+0

고마워. :). 또한 수용된 해결책에 의해 기술된다. 유효하지 않은 것으로 표시하도록 답변을 업데이트했습니다. – jjmontes