2016-08-24 6 views
0

TABLE_A, TABLE_B 및 TABLE_C 테이블이 세 개 있습니다. A & B는 외래 키와 일대일 매핑을가집니다 (두 테이블 모두 동일한 기본 ID를 가짐). B & C에는 일대일 관계가 있습니다. 다음과 같이 최대 절전 모드 매핑을 정의했습니다.일대 다 매핑 매핑 삭제 작동하지 않음

<class name="com.test.ClassA" table="TABLE_A"> 
     <id name="aId" type="long"> 
      <column name="A_ID" /> 
      <generator class="assigned" /> 
     </id> 
     <one-to-one name="classB" class="com.test.ClassB" cascade="all" lazy="false"/> 
    </class> 
    <class name="com.test.classB" table="TABLE_B"> 
     <id name="aId" type="long"> 
      <column name="A_ID" /> 
      <generator class="assigned"/> 
     </id> 
     <one-to-one name="classA" class="com.test.ClassA" constrained="true"/> 
     <set name="listOfC" table="TABLE_C" inverse="false"  lazy="false" fetch="select" cascade="all-delete-orphan"> 
      <key> 
       <column name="A_ID" not-null="true"/> 
      </key> 
      <one-to-many class="com.test.ClassC"/> 
     </set> 
    </class> 
    <class name="com.test.ClassC" table="TABLE_C"> 
     <id name="id" type="long"> 
      <column name="ID" /> 
      <generator class="identity"/> 
     </id> 
     <many-to-one name="classB" class="com.test.ClassB" fetch="select"> 
      <column name="A_ID"/> 
     </many-to-one> 
    </class> 

ClassA를 삽입/업데이트하려고하면 B와 C가 모두 저장됩니다. A.을 삭제할 때하지만

이 & 삭제 논리

public ClassA getClassA(final long aID)throws HibernateException, SQLException 
{ 
    HibernateCallback callback = new HibernateCallback() 
    { 
     public Object doInHibernate(Session session) throws HibernateException, SQLException 
     { 
      Criteria hctr = session.createCriteria(ClassA.class); 
      hctr.add(Restrictions.eq("A_ID", aID)); 
      return hctr.list(); 
     } 
    }; 
    List list = (List)this.getHibernateTemplate().execute(callback); 
    if(list==null || list.size()==0) 
    { 
     return null; 
    } 
    return (ClassA)list.get(0); 
} 

공공 무효 deleteClassA (긴 AID) HibernateException이,되는 SQLException 를 throw를 얻을 제약 조건 위반 예외를 받고 있어요 { 를 ClassA를 ClassA = getClassA (AID) ; if (classA! = null) { this.getHibernateTemplate(). delete (classA); }}

업데이트 TABLE_C 설정 A_ID = NULL 여기서 A_ID =]; 제약 조건 [null]; 중첩 예외 org.hibernate.exception.ConstraintViolationException이다 컬렉션 삭제하지 수 : org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException에서 [com.test.ClassB.listOfC# 77675]을 (SessionFactoryUtils.java:659) org.springframework.orm에서 org.springframework.orm.hibernate3.HibernateTemplate.doExecute (HibernateTemplate.java:416) 에서 org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException (HibernateAccessor.java:414)에서 . hibernate3.HibernateTemplate.executeWithNativeSession (HibernateTemplate.java:379) at org.springframework.orm.hibernate3.HibernateTemplate.delete (HibernateTemplate.delete getTemplate.java:887) at org.springframework.orm.hibernate3.HibernateTemplate.delete (HibernateTemplate.java:882) 발생 원인 : com.ibm.db2.jcc.am.oo : NULL 값을 a NOT NULL 열 "TBSPACEID = 3, TABLEID = 480, COLNO = 1"허용되지 않습니다 .. SQLCODE = -407, SQLSTATE = 23502, DRIVER = 어떤 이유 3.58.81

는, Hibernate는 노력을 TABLE_C 항목을 삭제하는 대신 Null 값으로 업데이트하십시오. 한가지 주목해야 할 것은 ClassA가 getClassA() funciton을 사용하여로드 될 때 ClassC의 "aId"값이 null이라는 것입니다. 테이블을 확인했는데 값이 존재합니다. DB에서 읽을 때 null이 아닌 이유는 알 수 없습니다.

답변

0

cascade.delete가 최대 절전 모드로 동작하도록하려면 id가 아닌 삭제 작업에 엔티티를 전달해야합니다. 그렇다면 deleteClassA (A a)에 의해 deleteClassA (long aId)를 대체하십시오 이 링크를 참조하십시오 Hibernate delete objects on cascade

관련 문제