我的多层应用程序中有一个问题,我已将我的对象从会话中分离出来。我有一个用户通过 GUI 编辑父对象的属性以及添加、编辑和删除子对象(父对象中的集合)。我正在级联所有,包括父对象及其子对象之间的孤立删除。
在将对象与 Session(saveOrUpdate 等)相关联时,插入和删除正在发生,但如果 GUI 的用户删除然后添加,则它发生的顺序违反了子对象的业务(自然)键的唯一约束返回相同的业务密钥)。
在查阅了“Hibernate in Action”一书以及在线参考页面之后,我似乎仍然无法找到一个明确的答案来解决当一个项目被删除然后重新添加到一个孩子的集合中时违反唯一约束的问题。父对象。
根据 Hibernate 文档中的行,Hibernate 永远不会在插入之前发出删除,如下所示
该文档在调用 flush() 时说明了以下顺序
- 所有实体插入的顺序与调用 Save 的顺序相同
- 所有实体更新
- 所有集合删除
- 所有集合元素的删除、更新和插入
- 所有集合插入
- 所有实体删除的顺序与调用删除的顺序相同。
暗示订单是“删除、更新和插入”,还是文档没有在这里严格指定订单?
Hibernate 似乎与此顺序不匹配,因为插入发生在删除我的集合元素之前。如果 Hibernate 总是先发出插入,那么这个问题的推荐解决方案是什么?我们是否必须走出 Hibernate 世界并自己处理这种关系?
如果是这样,那很好,但是如果 Hibernate 中有可用的解决方案,我真的不想为此编写代码。
如果我有一个表,其代理主键用于 AND 另一个列上的唯一约束,我可以通过调整映射文件中的属性来让 Hibernate 在调用 flush() 时遵守唯一约束吗?
来自在线参考文档:“然而,Hibernate 没有足够的信息来正确安排 SQL INSERT 和 UPDATE 语句(以避免违反约束),并且需要一些
有助于正确处理双向关联。使关联反转的一侧告诉 Hibernate 基本上忽略它,将其视为另一侧的镜像。这就是 Hibernate 在将定向导航模型转换为 SQL 数据库模式时解决所有问题所必需的。”