为了账号安全,请及时绑定邮箱和手机立即绑定

在 Spring Data Repositories 之上使用 EntityManager

在 Spring Data Repositories 之上使用 EntityManager

墨色风雨 2021-06-15 12:35:44
最近,我遇到了以下代码:@Transactionalpublic MyEntity insert(MyEntity entity) {    MyEntity merged = entityManager.merge(entity);    return myEntityRepository.save(merged);}其中实体管理器定义如下:@PersistenceContext private EntityManager entityManager;和存储库是 Spring QueryDSL 存储库:@Repositorypublic interface MyEntityRepository extends QueryDslRepository<MyEntity>{}我的问题是,entityManager.merge(entity)当我们使用myEntityRepositoryright after持久化实体时,是否真的需要调用?entityManager 是否正在执行存储库不能执行的操作?调用存储库还不够吗?
查看完整描述

2 回答

?
茅侃侃

TA贡献1842条经验 获得超21个赞

对我来说,这看起来像是货物崇拜编程。如果需要(有时是不需要的),的实现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);

    }

}


查看完整回答
反对 回复 2021-06-17
?
慕运维8079593

TA贡献1876条经验 获得超5个赞

对我来说,这看起来是一个非常危险的代码,意图有点模糊和一些过度设计:

  1. 您是否 100% 保证在您的层和存储库之间共享同一个事务管理器?如果没有,你就有麻烦了。

  2. 你只是在做双重工作(@Jens 回答表明了这一点)。

  3. @Transactional这里只会让事情变得更糟(如果你有一些非标准的冲洗政策)。尤其要注意,如果您从同一个类中调用方法,它将无法工作,因为它通过代理工作。

  4. 如果你真的打算insert()(新记录)你为什么需要merge()

我的投票是 - 就像save()@Jens 指出的那样使用。如果您确实需要insert()功能,那么您可能需要具有更新保护的真实事务,在这种情况下,我会在存储库层上执行一些自定义代码。希望你不需要它。


查看完整回答
反对 回复 2021-06-17
  • 2 回答
  • 0 关注
  • 171 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信