如何将Session或EntityManager绑定到线程?

时间:2011-08-28 22:40:41

标签: java multithreading hibernate session jpa

据我所知,当我在Spring事务中使用hibernate时,会话使用ThreadLocal绑定到线程。我的问题是:

  1. 如何访问会话或会话工厂(不将其注入bean)(因此通过线程区域设置)?

    2.如何在JPA方面做同样的事情,从而使用EnityManager / EntityManagerFactory?

2 个答案:

答案 0 :(得分:4)

  1. 您应该使用SessionFactory.getCurrentSession()来获取会话。会话从此方法返回的内容取决于hibernate.current_session_context_class中的配置参数hibernate.cfg.xml。如果设置为thread,则返回的会话从ThreadLocal获取,这意味着如果在当前Java线程中第一次调用它,则会打开并返回新的会话。如果在同一个线程中再次调用它,则将返回相同的会话。

  2. AFAIK,JPA中没有等效的SessionFactory.getCurrentSession()。我认为您已手动设置EntityManagerThreadLocal


  3. <强>参考

答案 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();  

这正是我所寻找的。