一、问题记录
最近需要配置jpa多数据源,按照网上的方法,配置config类,里面有个EntityManager方法
/**
* 配置EntityManager
*
* @param builder
* @return
*/
@Primary
@Bean(name = "smartlandEntityManager")
public EntityManager smartlandEntityManager(EntityManagerFactoryBuilder builder) {
return smartlandEntityManagerFactory(builder).getObject().createEntityManager();
}
使用时我是这样写
@Resource(name = "smartlandEntityManager")
private EntityManager entityManager;
结果发现查询结果一直有缓存,后面查找了资料想了下,发现这么写有几个问题:
1、EntityManager 是线程不安全的,不应该创建这种单例的bean去管理
2、jpa的一级缓存是针对于EntityManager,即同个EntityManager实例,如果不进行事务提交,那么查询的结果会有缓存,而我们平时使用@transaction开启事务,实际上开启的事务是注册到spring容器上下文创建的EntityManager实例(下面会说明),并不是我在config类中创建的EntityManager实例,

本文介绍了在使用JPA时,关于EntityManager的一个常见问题。由于EntityManager是线程不安全的,直接在配置类中创建单例bean会导致缓存问题。正确的做法是避免在config类中创建EntityManager Bean,而是直接利用Spring容器提供的。正常情况下,每个请求会有两个EntityManager,一个用于处理懒加载,另一个用于数据库操作。使用@PersistenceContext注解可以获得与请求线程绑定的EntityManager,确保事务和查询使用同一实例。
最低0.47元/天 解锁文章
418

被折叠的 条评论
为什么被折叠?



