Hibernate加入了子类更新

时间:2011-11-25 03:09:10

标签: hibernate

我有一个基类A和两个子类BC。我有一个B的实例,我正在尝试更新并将类型更改为C。包含更新数据的C实例是暂时的,因为我无法想象无论如何都要修改持久化实例。

当瞬态实例从前端传递到服务层时,会话开始并进行一些检查以确保它是有效的操作。在此会话期间,将检索持久性实例(B)。假设一切都检出,瞬态对象(应该是)持久化。

看起来.merge()是正确的调用方法,但是我们得到一个NonUniqueObjectException,好像我们调用了.update()(它也不起作用,因为持久性不应该实例目前在会话中。)

我不知道为什么.merge()给出NonUniqueObjectException,因为我的理解是.merge()是针对这种情况的;尝试使用瞬态实例更新会话中存在的实体。 我的猜测令人不安的是,持久化实例与瞬态实例不同;我测试过,当我在同一个类的瞬态实例上调用.merge()时,一切都按预期工作。

不确定接下来要做什么,我尝试对持久化实例执行.evict(),然后对瞬态实例执行.update(),但这会给我一个StaleObjectException。此时,我无法想出解决方案。我们是在尝试做一些愚蠢的事情,还是会出现某种配置问题?

1 个答案:

答案 0 :(得分:0)

你不能用Java做,也不能用hibernate做。它只能通过数据库中的直接SQL查询(绕过休眠)来实现。您需要做的是,在休眠术语中,删除B并创建一个新的C。您需要手工处理所有引用和关系(显然存在于A)。 C will also be assigned a new id (in case that A`有一个自动增量ID或其他东西)。