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