Hibernate-在删除语句之前保存修改后的子集合发出insert语句

时间:2013-01-08 09:46:53

标签: hibernate collections persistence

我的多层应用程序中存在一个问题,我将会话中的对象分离出来。 我有一个用户通过GUI编辑父对象的属性以及添加,编辑和删除子对象(父对象内的集合)。 我正在级联所有包括父对象及其子对象之间的孤立删除。

在将对象与会话(saveOrUpdate等)相关联后,插入和删除正在发生,但如果GUI的用户删除,则发生的顺序违反了子对象的业务(自然)键的唯一约束然后添加回相同的业务键)。

在查阅了“Hibernate in Action”一书以及在线参考页面之后 当一个项目被删除然后被添加回父对象的子集合时,我仍然无法找到对违反唯一约束问题的明确答案。

根据Hibernate文档中的行,Hibernate从不在插入之前发出删除,如下所示

文档说明了对flush()

的调用的以下顺序
  1. 所有实体插入的顺序与Save相同,
  2. 所有实体更新
  3. 所有集合删除
  4. 所有集合元素删除,更新和插入
  5. 所有收集插入
  6. 调用与删除顺序相同的所有实体删除。
  7. 将订单视为“删除,更新和插入”,或者文档未严格指定订单?

    Hibernate似乎与此顺序不匹配,因为在删除我的集合元素之前发生了插入。 如果Hibernate总是首先发出插入,那么这个问题的推荐解决方案是什么? 我们是否必须走出Hibernate世界并自己处理这种关系?

    如果是这样,那很好,但是如果有的话,我真的不想要围绕这个进行编码 Hibernate中提供的解决方案。

    如果我有一个带有代理主键的表,用于AND的唯一约束 在另一个列上,我可以让Hibernate通过调整映射文件中的属性调用flush()来遵守唯一约束吗?

    从在线参考文档: “然而,Hibernate没有足够的信息来正确安排SQL INSERT和UPDATE语句(以避免违反约束),并且需要一些

    帮助正确处理双向关联。使关联逆的一方告诉Hibernate基本上忽略它,将它视为另一方的镜像。这就是Hibernate在将方向导航模型转换为SQL数据库模式时解决所有问题所必需的。“

1 个答案:

答案 0 :(得分:0)

这需要您在pojo中调整PK属性的配置,使用@Id似乎会导致此问题,请使用@EmbeddedId来修复此问题... refer to this hibernate bug了解更多信息细节