Как привязать Session или EntityManager к потоку? - PullRequest
4 голосов
/ 29 августа 2011

Как я понимаю, когда я использую hibernate с транзакциями Spring, сеанс привязывается к потоку с помощью ThreadLocal. Мои вопросы:

  1. Как получить доступ к сеансу или фабрике сеансов (без внедрения их в bean-компонент) (таким образом, по локали потока)?

    2.Как я могу сделать то же самое с точки зрения JPA, таким образом используя EnityManager / EntityManagerFactory?

Ответы [ 2 ]

4 голосов
/ 29 августа 2011
  1. Вы должны использовать SessionFactory.getCurrentSession () , чтобы получить ваш сеанс.Сеанс, возвращаемый этим методом, зависит от параметра конфигурации hibernate.current_session_context_class в hibernate.cfg.xml.Если он установлен на thread, возвращаемый сеанс будет получен из ThreadLocal, что означает, что если он вызывается впервые в текущем потоке Java, новый сеанс открывается и возвращается.Если он вызывается снова в том же потоке, будет возвращен тот же сеанс.

  2. AFAIK, в JPA нет эквивалента SessionFactory.getCurrentSession().Я думаю, вы установили вручную и получили EntityManager для ThreadLocal


Ссылка

0 голосов
/ 25 апреля 2018

Я пытался выяснить это сегодня и в итоге сделал это следующим образом:

@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();  

, это именно то, что я искал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...