我使用无状态事务服务(意思是,我为每次调用打开一个新会话和事务),如下所示:
@Transactional
void someService(Object o) {
Object newO = entityManager.merge(o);
newO.getChildren().add(something);
}
我传递给服务的对象是分离对象。 merge(object)
的问题是,它返回一个新实例进行操作,而不是让参数本身持久化。因此,我对持久对象所做的任何更改都不会发生在内存中的原始对象上。
我当然可以重新连接我所有的本地参考资料,但我希望有更好的解决方案。
有没有办法让我的本地实例托管,而不是获取新实例?
我尝试了refresh(object)
和update(object)
,但我确实得到了异常,因为对象的关联仍然是分离的。
当我注释与@Cascade(value=CascadeType.save-update)
的关联时,它工作正常,但是当我有很多OneToMany或ManyToMany关联时,这不会导致性能问题吗?
答案 0 :(得分:1)
答案 1 :(得分:0)
您可以使用find(entityClass, primaryKey)方法加载对象。只需指定主键和实体Class值,它就会从DB中返回一个活动对象。
现在对此对象进行更改以及对此活动对象所做的任何更改都将反映出来,并且hibernate将相应地更新数据库。我亲自面对这种情况,这对我有用。