テーブルTABLE_A、TABLE_B、TABLE_Cの3つがあります。 A & Bは、外部キーとの1対1のマッピングを持っています(両方のテーブルが同じプライマリIDを持っています)。 B & Cは、1対多数の関係を持っています。私は以下のように、ハイバネートマッピングを定義しました。HIbernate 1対多マッピングの削除が動作しない
<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);
}
ます。public void deleteClassA(ロングAID)はHibernateExceptionで、のSQLException { にClassAクラスA = 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(SessionFactoryUtils.java:659) で[com.test.ClassB.listOfC#77675]: 、コレクションを削除できませんでした org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:414) で でorg.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:416) org.springframework.ormました。 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エントリを削除する代わりにヌル値で更新します。私が観察したことの1つは、classAがgetClassA()ファンクションを使用してロードされると、ClassCの "aId"値がnullであるということです。私はテーブルを確認して、値が存在します。 DBからの読み込み時にnullである理由は考えられません。