java就是javax。坚持不懈EntityManager线程安全
我在没有@PersistenceContext的may Dao层中使用EntityManager,但Dao方法正在调用标记为@Transactional的服务方法。我的问题是,我应该在dao层中使用EntityManager工厂,每次都让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
# 1 楼答案
只需将@PersistenceContext添加到实体管理器中,容器就会为您处理它,但是如果您不在JEE环境中,那么创建您自己的实体管理器工厂,但我认为在您当前的情况下,实体管理器仍然为空。此外,您还必须创建持久化单元XML文件,并注意事务类型。如果使用@PersistenceContext,则必须是JTA;如果要创建自己的实体管理器工厂,则必须是RESSOURCE_LOCAL
# 2 楼答案
这个问题Is EntityManager really thread-safe?已经得到了你问题的答案
这个“Future-Proofing Java Data Access - DAO Pattern Done Right”展示了如何设计DAO层
但如果您使用的是Spring和Spring数据存储库,那么我建议使用CrusRepository或JpaRepository接口定义存储库。 这将把您对EntityManager处理的担忧转移到Spring上