我有一个基类A
和两个子类B
和C
。我有一个B
的实例,我正在尝试更新并将类型更改为C
。包含更新数据的C
实例是暂时的,因为我无法想象无论如何都要修改持久化实例。
当瞬态实例从前端传递到服务层时,会话开始并进行一些检查以确保它是有效的操作。在此会话期间,将检索持久性实例(B
)。假设一切都检出,瞬态对象(应该是)持久化。
看起来.merge()
是正确的调用方法,但是我们得到一个NonUniqueObjectException,好像我们调用了.update()
(它也不起作用,因为持久性不应该实例目前在会话中。)
我不知道为什么.merge()
给出NonUniqueObjectException,因为我的理解是.merge()
是针对这种情况的;尝试使用瞬态实例更新会话中存在的实体。 我的猜测令人不安的是,持久化实例与瞬态实例不同;我测试过,当我在同一个类的瞬态实例上调用.merge()
时,一切都按预期工作。
不确定接下来要做什么,我尝试对持久化实例执行.evict()
,然后对瞬态实例执行.update()
,但这会给我一个StaleObjectException。此时,我无法想出解决方案。我们是在尝试做一些愚蠢的事情,还是会出现某种配置问题?
答案 0 :(得分:0)
你不能用Java做,也不能用hibernate做。它只能通过数据库中的直接SQL查询(绕过休眠)来实现。您需要做的是,在休眠术语中,删除B
并创建一个新的C
。您需要手工处理所有引用和关系(显然存在于A
)。 C will also be assigned a new id (in case that
A`有一个自动增量ID或其他东西)。