使用hibernate无法从set中删除项目

时间:2015-03-13 14:34:53

标签: hibernate requestfactory

我在报告和设置之间有一对多的关系。映射在父级中定义为

  <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>

我的测试加载&#34;报告&#34;,找到&#34;设置&#34;,将其从列表中删除,并在ReportDao上调用saveOrUpdate()。这按预期工作,设置被删除。

现在令人费解的部分。通过RequestFactory调用调用相同的方法,不会删除记录。我看到没有例外,Hibernate Interceptor表示
1:已为预期的条目调用onDelete()方法,
2:该transaction.wasCommitted()== true。 (在afterTransactionCompleted()方法中)。

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

1 个答案:

答案 0 :(得分:0)

我发现了问题,但我现在担心RequestFactory和Hibernate如何协同工作。

数据库表已映射

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

RequestFactory有一个&#34; .with&#34;来自带有2个映射的报告:

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

如果我删除了这两个.with语句中的第二个,Set<Settings>已成功保存到数据库中。如果我同时拥有它们,那么hibernate拦截器告诉我它将删除它,但它没有,如原始帖子中所述。

我觉得这很令人不安。
为什么.with会产生这种效果?
为什么拦截器告诉我它会删除,tx.isCommitted()何时不删除?