2014-09-10 44 views
0

我有以下Hibernate映射和Java類結構:Hibernate不刪除主行時子被刪除

<class name="A" abstract="true" table="tableA" lazy="false"> 
     <id name="id" type="long"> 
      <generator class="native" /> 
     </id> 

     <discriminator column="type" type="string" />  
     <!--common properties-->  

     <subclass name="B" abstract="true" >   
      <join table="tableB"> 
       <key column="aId"/>    
       <!--subclass common properties-->           
      </join> 

      <subclass name="B1" discriminator-value="B1TYPE" > 
       <!--subclass properties-->         
      </subclass>  

      <subclass name="B2" discriminator-value="B2TYPE" > 
       <!--subclass properties-->   
      </subclass>   
    </subclass>   
</class> 

<class name="C" table="tableC"> 
     <id name="id" type="long"> 
       <generator class="native" /> 
      </id> 
      <set name="items" cascade="all,delete-orphan"> 
       <key column="id" not-null="true" /> 
       <one-to-many class="A" /> 
      </set> 
    </class> 

和Java部分:

abstract class A 
{ 
} 

abstract class B extends A 
{ 
} 

class B1 extends B 
{ 
} 
class B2 extends B 
{ 
} 

class C 
{ 
    Set<A> items; 
} 

的問題是,有些時候情況從tableB刪除行,但不會從tableA刪除。可能的原因是什麼?

編輯:

當項目從class C去除,C存儲從它的倉儲類:

C.items.remove(B1); 
CRepository.store(C); 
+0

您可以添加導致此問題的代碼? – Chaitanya 2014-09-10 11:59:05

+0

從項目中刪除項目時出現問題。是否有可能從其他表的外鍵(限制)到tableA防止從tableA刪除?我認爲在這種情況下,hibernate不應該從tableB刪除行,對吧? – 2014-09-10 12:07:01

回答

2

的原因是,你必須明確地定義tableB外鍵的作用on-delete聲明指向aId

默認情況下,這是noaction:這意味着當您刪除任何B實體時,相應的A相關實體不會被刪除。

查找Hibernate文檔更多的信息,5.1.11.3. Key

給一個嘗試這種映射:

<subclass name="B" abstract="true" >   
     <join table="tableB"> 
      <key column="aId" on-delete="cascade"/>    
      <!--subclass common properties-->           
     </join> 

     <subclass name="B1" discriminator-value="B1TYPE" > 
      <!--subclass properties-->         
     </subclass>  

     <subclass name="B2" discriminator-value="B2TYPE" > 
      <!--subclass properties-->   
     </subclass>   
</subclass>