考虑Hibernate 3,
我有一个父表和一个子表,由外键链接。 我声明了一个多对一的关联到父hbm文件与cascade all属性。 我首先坚持父母(保存或坚持)并保存父母和孩子。好到目前为止。 但是在另一个会话中,我创建了一个新的父对象(functionnaly不同于第一个会话的对象)并且我引用了一个新的子对象(但是它的功能只是SAME而不是第一个会话的对象,它是此时的瞬态物体)
我想知道Hibernate是否可以原生支持并确定我正在管理同一个孩子(所以当我保存新父母时不要试图坚持它)或者我是否必须开发往返数据库并检查如果孩子已经在场?
全部谢谢
答案 0 :(得分:2)
Hibernate通过其主键识别对象。因此,如果这两个子节点具有相同的主键,它需要是业务生成的键,Hibernate就会知道它是同一个对象。但是,它仍然不知道它是否应该对数据库执行更新或插入。您可以在子节点上显式调用merge
,Hibernate将在数据库中搜索它,并创建或更新它。
但是,这并不容易:
一个问题是业务生成密钥。让Hibernate生成代理键更好。
另一个问题是需要使用merge
,如果存储此类,则必须始终使用merge
。考虑删除级联,因为无论如何你必须明确地存储它。
请注意merge
返回需要使用的另一个实例。 (这意味着:将{{1}}的返回值分配给父项的属性。)
你遇到的 root问题是业务逻辑两次创建同一个对象。如果要重用其他人创建的实例,则需要通过在数据库中搜索或将其作为参数传递来获取它。在尝试任何变通方法之前,请尝试解决此类问题。