【问题标题】:Cannot delete item from set using hibernate无法使用休眠从集合中删除项目
【发布时间】:2015-03-17 16:54:31
【问题描述】:

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

  <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 调用调用相同的方法,记录不会被删除。我没有发现异常,并且休眠拦截器指示
1:onDelete() 方法已为预期的条目调用,
2:那个 transaction.wasCommitted() == true。 (在 afterTransactionCompleted() 方法中)。

似乎一切正常,但该记录并未从数据库中删除。我检查了 SQL 输出,没有发现任何删除。

【问题讨论】:

    标签: hibernate requestfactory


    【解决方案1】:

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

    数据库表被映射

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

    RequestFactory 有一个来自报告的“.with”,带有 2 个映射:

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

    如果我删除了这 2 个 .with 语句中的第二个,Set&lt;Settings&gt; 将成功保存到数据库中。如果我两者都有,那么休眠拦截器会告诉我它将删除它,但它不会,如原始帖子中所述。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-08
      • 1970-01-01
      相关资源
      最近更新 更多