javax.persistence.EntityManager线程安全吗

时间:2019-03-28 09:10:44

标签: java hibernate jpa

我正在May Dao层中使用EntityManager,而没有@PersistenceContext,但是Dao方法正在调用标记为@Transactional的服务方法。我的问题是我应该在dao层中使用EntityManagerFactory并每次获取EntityManager来保持线程安全还是已经对其进行处理?

Dao层:

@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!

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

这个stackoverflow问题Is EntityManager really thread-safe?已经回答了您的问题。

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

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