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이 아닌 이유는 알 수 없습니다.