2015-03-13 84 views
0

我在报告和设置之间存在一对多的关系。映射在父定义为无法使用休眠功能从设置中删除项目

<set name="settings" table="SETTING" inverse="true" lazy="true" fetch="select" cascade="all-delete-orphan"> 
     <key> 
      <column name="REPORT_ID" not-null="true" /> 
     </key> 
     <one-to-many class="net.test.domain.Setting" /> 
    </set> 

那孩子映射这样

<many-to-one name="report" class="net.test.domain.Report" fetch="select" cascade="evict"> 
     <column name="REPORT_ID" /> 
    </many-to-one> 

父我的测试加载了“报告”,找到“设置”,从列表中删除,在ReportDao上调用saveOrUpdate()。这按预期工作,该设置被删除。

现在令人费解的部分。通过RequestFactory调用调用相同的方法,记录不会被删除。我没有看到异常,Hibernate拦截器指示
1:已针对预期条目调用onDelete()方法,
2:that transaction.wasCommitted()== true。 (在afterTransactionCompleted()方法中)。

所有似乎都没问题,但记录不会从数据库中删除。我检查SQL输出,并没有发现删除。

回答

0

我发现了这个问题,但我现在关心的是RequestFactory和Hibernate是如何协同工作的。

数据库表映射

Report - Setting - Type 
and 
Report - Column - Type - Setting 

RequestFactory有一个从报告2名映射 “随着”:

with.add("settings"); 
with.add("Column.Type.settings"); 

如果我删除那些2个.with报表二,Set<Settings>已成功保存到数据库。如果我有两个,那么hibernate拦截器会告诉我它将删除它,但它不会如原始文章中所述。

我觉得这很麻烦。
为什么一个.with有这个效果?
为什么拦截器告诉我它会删除,而tx.isCommitted()不删除时呢?