我正在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!
答案 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。