最近,我遇到了以下代码:
@Transactional
public MyEntity insert(MyEntity entity) {
MyEntity merged = entityManager.merge(entity);
return myEntityRepository.save(merged);
}
其中实体管理器的定义如下:
@PersistenceContext private EntityManager entityManager;
存储库是Spring QueryDSL存储库:
@Repository
public interface MyEntityRepository extends QueryDslRepository<MyEntity>{
}
我的问题是,当我们紧接着使用entityManager.merge(entity)
持久化实体时,是否真的需要调用myEntityRepository
?实体管理器在做某些事情,仓库无法做到吗?调用存储库不够吗?
答案 0 :(得分:2)
在我看来,这就像是对货物的崇拜。 implementation of save()
已在必要时进行合并(有时是不必要的合并):
/*
* (non-Javadoc)
* @see org.springframework.data.repository.CrudRepository#save(java.lang.Object)
*/
@Transactional
public <S extends T> S save(S entity) {
if (entityInformation.isNew(entity)) {
em.persist(entity);
return entity;
} else {
return em.merge(entity);
}
}
答案 1 :(得分:0)
对于我来说,这看起来像是一个非常危险的代码,意图有点模糊,并且过度设计:
@Transactional
只会使情况变得更糟(如果您有一些非标准的冲洗政策)。尤其要注意,如果您从与通过代理工作的类相同的类中调用方法,则该方法将无效。
insert()
(新记录),为什么根本需要merge()
?我的投票是-就像@Jens指出的那样使用save()
。如果您确实需要insert()
功能,那么您可能需要具有防止更新的真实交易,在这种情况下,我将在存储库层上执行一些自定义代码。希望你不需要它。