【问题标题】:Is javax.persistence.EntityManager thread safejavax.persistence.EntityManager 线程安全吗
【发布时间】:2019-03-28 09:10:43
【问题描述】:

我在没有@PersistenceContext的may Dao层中使用EntityManager,但是Dao方法正在调用标记为@Transactional的服务方法。我的问题是我应该在 dao 层使用 EntityManagerFactory 并且每次都让 EntityManager 保持线程安全还是已经处理?

道层:

@RequiredArgsConstructor
public class UserDaoImpl {

 private final EntityManager em;

 public void save(User user){
     em.persist(user);
 }
}

服务层:

@RequiredArgsConstructor
public class UserService {

 private final UserDao userDao;

 @Transactional
 public void save(User user) {
   userDao.save(user);
 }
}

Tnx!

【问题讨论】:

    标签: java spring hibernate jpa entitymanager


    【解决方案1】:

    只需将@PersistenceContext 添加到您的实体管理器,容器将为您处理它,但如果您不在 JEE 环境中,请创建自己的实体管理器工厂,但我认为在您当前的情况下,实体管理器仍将为空。此外,您必须创建持久性单元 XML 文件,并注意事务类型,如果您使用 @PersistenceContext,它必须是 JTA,如果您要创建自己的实体管理器工厂,它应该是 RESSOURCE_LOCAL。

    【讨论】:

    • 我正在使用 Spring Boot 2+,它工作正常,只是想确保它在我的情况下是否是线程安全的,或者我需要在其上添加 @PersistenceContext。
    • 如果你使用的是 Spring Boot,那么你就不需要 @PersistenceContext。
    • 那么 Spring Boot 会处理一切吗?
    • 我认为是的,因为你已经在使用@Transactional,所以 spring 会为你处理事务,看看这个:dzone.com/articles/how-does-spring-transactional
    【解决方案2】:

    这个stackoverflow问题Is EntityManager really thread-safe?已经得到了你的问题的答案。

    而这个“Future-Proofing Java Data Access - DAO Pattern Done Right”展示了如何设计DAO层。

    但是,如果您使用的是 Spring 和 Spring Data 存储库,那么我建议您使用 CrusRepository 或 JpaRepository 接口定义存储库。 这会将您对 EntityManager 处理的担忧转移到 Spring。

    【讨论】:

      猜你喜欢
      • 2020-04-15
      • 2011-07-04
      • 2014-04-26
      • 2012-11-30
      • 2010-12-30
      • 2013-03-12
      • 2021-08-03
      • 2010-12-27
      • 2018-06-04
      相关资源
      最近更新 更多