2011-11-25 72 views
1

我有一个基类,A,和两个子类,BC。我有一个B的实例,我试图更新并将其类型更改为C。包含更新数据的C的实例是暂时的,因为我无法想象有修改持久实例的方法。休眠加入子类更新

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

这似乎是.merge()是调用正确的方法,但我们得到了一个N​​onUniqueObjectException,我们仿佛被称为.update()(这也不管用,不应该因为持久实例目前是在会议) 。

我不知道为什么.merge()是给出了NonUniqueObjectException,因为我的理解是.merge()是专门用于这种情况;试图用临时实例更新会话中存在的实体。 我的猜测是令人不安的是,持久实例与瞬态实例不同;我测试过了,当我在相同类的瞬态实例上调用.merge()时,所有内容都按预期工作。

不知道接下来要做什么,我试着做.evict()的持久实例,然后.update()在瞬态的,但是这给了我一个StaleObjectException。在这一点上,我无法想出一个解决方案。我们是在试图做一些愚蠢的事情,还是会出现某种配置问题?

回答

0

你不能在Java中做这个,也不能在休眠中做到这一点。它只能通过数据库中的直接SQL查询(绕过休眠)。您需要在休眠期间删除B并创建一个新的C。您需要亲自处理所有参考和关系(显然存在于A)。 C#will also be assigned a new id (in case that A`有一个自动增量ID或者某物)。

+0

所以问题是改变子类呢?我有点失望,它不受支持。 –

+0

是的。无论如何,你怎么能用Java来做到这一点?你不能。 – cherouvim