2

可能重复:
休眠:具有相同标识符值的不同对象已与会话关联

我有一个休眠问题:

我有以下课程:人

我正在从服务器端的数据库中加载一个特定的 Person.class “A”。然后我通过 JSP 页面将此对象呈现给客户端。

客户端将“A”操作到“B”,然后通过表单将其发送回。我将服务器端的 Person.class "B" 对象加载到一个新变量中,然后尝试存储它。

但由于整个应用程序是基于会话的,我不能简单地调用:

HibernateTemplate.saveOrUpdate("B");

相反,我必须在保存之前将“B”与“A”合并。

但是当我打电话

HibernateTemplate.merge("B");

“B”对象仍然获得我不想再存储的“A”的所有属性。我希望“B”完全替换“A”对象,而不通过合并它们来获得一些“A”属性。

所以我的问题是:

Hibernate 中是否有任何“覆盖”或“替换”功能可以覆盖会话中具有与一个特定对象的属性相同的标识符的所有对象?

(在示例中从表单返回的对象“B”)

它还应该防止 Hibernate 抱怨:

Exception in thread "main" org.hibernate.NonUniqueObjectException: a   
different object with the same identifier value was already associated
with the session:
4

1 回答 1

1

您可以先从会话中逐出对象,然后使用 update 将另一个对象附加到会话中。

我会在您的服务中这样做:

sessionFactory.getCurrentSession().evict(myObject);
sessionFactory.getCurrenctSession().update(myNewerObject);

您不应该在控制器中执行任何数据库操作,因为这需要事务控制器方法。

于 2012-07-25T13:19:13.137 回答