在spring+jpa情况下,经常这么写service层或dao层
[code="java"]
public class BrandServiceDao implements BrandDao {
@PersistenceContext
protected EntityManager entityManager;
// business
}
[/code]
一般service和dao都被是singleton 但这种情况下,
entityManager没有线程安全问题么
或者说这么证明不同线程拿到的entityManager是不同的实例对象
我自己做了下模拟,也许方式不对,拿到的entityManager(代理对象)的hashcode都是一样的
嗯 原模原样的输出是:
[code="java"]Shared EntityManager proxy for target factory [org.springframework.orm.jpa.LocalEntityManagerFactoryBean@1b64ef8][/code]
共享的entityManager代理?
entityManager 线程不安全的
共享的entityManager代理?
你猜对了 spring提供了EntityManager 的 代理 EntityManagerProxy
SharedEntityManagerCreator来创建代理
return (EntityManager) Proxy.newProxyInstance(
(cl != null ? cl : SharedEntityManagerCreator.class.getClassLoader()),
ifcs, new SharedEntityManagerInvocationHandler(emf, properties));