2010-08-23 31 views
1

我不知道爲什麼Hibernate會爲每個實體1刪除子表 而不是使用外鍵hibernate cascading delete,爲什麼不能在外鍵上刪除一個?

一個刪除這裏的hibernate.cfg.xml文件(不,我不是下一個SO:-t

<hibernate-configuration> 
    <session-factory> 
     <property name="hibernate.connection.url">jdbc:hsqldb:file:testdb;shutdown=true</property> 
     <property name="hibernate.connection.driver_class">org.hsqldb.jdbcDriver</property> 
     <property name="hibernate.connection.username">sa</property> 
     <property name="hibernate.connection.password"></property> 
     <property name="hibernate.connection.pool_size">0</property> 
     <property name="hibernate.dialect">org.hibernate.dialect.HSQLDialect</property> 
     <property name="hibernate.show_sql">true</property> 
     <property name="hibernate.format_sql">true</property> 
     <property name="hbm2ddl.auto">auto</property> 
     <mapping file="entities/Question.hbm.xml"/> 
     <mapping file="entities/Answer.hbm.xml"/> 

    </session-factory> 

Question.hbm.xml

<hibernate-mapping> 
    <class name="entities.Question"> 
     <id name="id"> 
     <generator class="native" /> 
     </id> 
     <property name="title" not-null="true"> 
     </property> 

     <property name="question" type="text" not-null="true"> 
     </property> 

     <bag name="answers" inverse="true" cascade="all,delete-orphan" > 
     <key> 
      <column name="questionId" index="answer_questionId_idx" not-null="true"/> 
     </key> 
     <one-to-many class="entities.Answer" /> 
     </bag> 

     <property name="created" update="false" > 
     <column name="created" not-null="true" index="answer_created_idx"></column> 
     </property> 
     <property name="lastUpdated"> 
     <column name="lastUpdated" not-null="true" index="answer_lastUpdated_idx"></column> 
     </property> 
    </class> 
</hibernate-mapping> 

Answer.hbm.xml

<hibernate-mapping> 
    <class name="entities.Answer"> 
     <id name="id"> 
     <generator class="native" /> 
     </id> 

     <property name="answer" type="text" not-null="true"> 
     </property> 

     <property name="created" update="false" > 
      <column not-null="true" name="created" index="question_created_idx"></column> 
     </property> 

     <property name="lastUpdated" > 
      <column name="lastUpdated" not-null="true" index="question_lastUpdated_idx"></column> 
        </property> 

     <many-to-one name="question" column="questionId" not-null="true" update="false"> 
     </many-to-one> 
    </class> 
</hibernate-mapping> 

有1個提問和2個答案在我的數據庫,這個測試代碼:

Session session = factory.openSession(); 
Transaction t = session.beginTransaction(); 
Question q = (Question) session.load(Question.class,1); 
session.delete(q); 
t.commit(); 
session.close(); 

我希望它生成SQL一樣,

select .... from Questions where id = 1; 
delete from Answers where questionId=1; 
delete from Question where id=1; 

也就是說,只是發出一個刪除做級聯刪除的答案,而不是 它加載所有的答案,每發行一個答案刪除,如:

select 
    question0_.id as id0_0_, 
    question0_.title as title0_0_, 
    question0_.question as question0_0_, 
    question0_.created as created0_0_, 
    question0_.lastUpdated as lastUpda5_0_0_ 
from 
    Question question0_ 
where 
    question0_.id=? 

select 
    answers0_.questionId as questionId0_1_, 
    answers0_.id as id1_, 
    answers0_.id as id1_0_, 
    answers0_.answer as answer1_0_, 
    answers0_.created as created1_0_, 
    answers0_.lastUpdated as lastUpda4_1_0_, 
    answers0_.questionId as questionId1_0_ 
from 
    Answer answers0_ 
where 
    answers0_.questionId=? 

delete from Answer where  id=? 
delete from Answer where  id=? 
delete from Question where  id=? 

如何COM e,有什麼我可以做的嗎?

編輯,作爲對Nate Zaugg的迴應,我可以通過在一對多鍵映射上設置on-delete =「cascade」來讓db執行級聯刪除,我更想知道爲什麼hibernate會做什麼它確實並沒有在Answers表上刪除一個,並且在我的映射中有些問題。

回答

1

您可以不配置您的DMBS在關係上進行級聯刪除嗎?這很容易做到。

編輯:試試這個<one-to-many class="entities.Answer" lazy="false" cascade="all" />

+0

這並不回答這個問題。 – 2010-08-23 23:13:16

+0

我相信它回答了「我能做些什麼」部分! :) – 2010-08-23 23:15:27

相關問題