2016-08-24 14 views
0

テーブル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である理由は考えられません。

答えて

0

cascade.deleteが休止状態になるようにするには、IDではなく削除操作にエンティティを渡す必要があります。次にあなたの場合deleteClassA(long aId)をdeleteClassA(A a)に置き換えて このリンクを参照Hibernate delete objects on cascade

関連する問題