【问题标题】:Reattaching and manipulating a detached instance in Hibernate (JPA)在 Hibernate (JPA) 中重新附加和操作分离的实例
【发布时间】:2013-10-15 08:40:01
【问题描述】:

我使用无状态事务服务(意思是,我为每个调用打开一个新会话和事务),如下所示:

@Transactional
void someService(Object o) {
    Object newO = entityManager.merge(o);
    newO.getChildren().add(something);
}

我传递给服务的对象 o 是一个分离的对象merge(object) 的问题在于,它返回一个 新实例 进行操作,而不是使参数本身持久化。因此,我对持久对象所做的任何更改都不会发生在内存中的原始对象上。

我当然可以重新连接我所有的本地参考,但我希望有更好的解决方案。

有没有办法让我的本地实例托管,而不是获取一个新实例?

我尝试了refresh(object)update(object),但我确实遇到了异常,因为对象的关联仍然是分离的。

当我用 @Cascade(value=CascadeType.save-update) 注释关联时,它工作正常,但是当我有很多 OneToMany 或 ManyToMany 关联时,这不会导致性能问题吗?

【问题讨论】:

    标签: java hibernate jpa entitymanager stateless


    【解决方案1】:

    我认为您可以只使用分离的Object o,然后再使用session.update(o)

    试试看this video tutorial,也许会有用!

    Ciao!

    【讨论】:

    • +1 感谢链接。出于某种原因,它对我来说不能正常工作。一旦我了解了这一点,我会审查并发布。
    • 我明白了。我应该提到我在对象分离时操纵关联。所有被操纵的关联似乎都需要 cascade=save-update 注释,或者他抱怨在更新调用期间它们没有被附加
    • 好!了解有用!
    【解决方案2】:

    您可以使用find(entityClass, primaryKey) 方法来加载您的对象。只需指定主键和实体类值,它就会从数据库中返回一个活动对象。

    现在对这个对象进行更改,对这个活动对象所做的任何更改都会被反映回来,hibernate 将相应地更新数据库。我个人遇到过这样的情况,这对我有用。

    【讨论】:

    • 我在内存中有一个本地对象,它是分离的。如何管理此本地实例? find() 也会返回一个新实例。
    • 完成更改后,您可以persist()该对象,更改将被反映。
    猜你喜欢
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-07
    • 2010-10-29
    • 1970-01-01
    相关资源
    最近更新 更多