据我所知,当我在Spring事务中使用hibernate时,会话使用ThreadLocal绑定到线程。我的问题是:
如何访问会话或会话工厂(不将其注入bean)(因此通过线程区域设置)?
2.如何在JPA方面做同样的事情,从而使用EnityManager / EntityManagerFactory?
答案 0 :(得分:4)
您应该使用SessionFactory.getCurrentSession()来获取会话。会话从此方法返回的内容取决于hibernate.current_session_context_class
中的配置参数hibernate.cfg.xml
。如果设置为thread
,则返回的会话从ThreadLocal
获取,这意味着如果在当前Java线程中第一次调用它,则会打开并返回新的会话。如果在同一个线程中再次调用它,则将返回相同的会话。
AFAIK,JPA中没有等效的SessionFactory.getCurrentSession()
。我认为您已手动设置EntityManager
到ThreadLocal
<强>参考强>
答案 1 :(得分:0)
我今天试图解决这个问题并最终采用这种方式:
@PersistenceContext(unitName = "jpaSessionFactoryName")
private EntityManager jpaSession;
我发现此文档非常有用: https://docs.spring.io/spring/docs/4.3.2.RELEASE/spring-framework-reference/htmlsingle/#orm-jpa-straight
当您使用@PersistenceContext时,Spring会注入一个代理,该代理为您提供绑定到当前事务的EntityManager(如果没有,则为新事务)。这看起来像是hibernate的直接替代品:
sessionFactory.getCurrentSession();
这正是我所寻找的。 p>