Следующий код запускается всякий раз, когда я хочу сохранить любую сущность. Кажется, что все работает нормально, но я не понимаю, как это работает!Как работает JPA-транзакция
EntityManager em = getEntityManager();
EntityTransaction userTransaction = em.getTransaction();
userTransaction.begin();
em.persist(ent);
userTransaction.commit();
EntityManager, приведенный выше, представляет собой единый экземпляр, общий для всего приложения. После начала транзакции; Я просто говорю em.persist (entity) .. Как hibernate знает, что это принадлежит к какой транзакции!
Предположим, что в моем приложении 10 одновременных пользователей и все 10 потоков, выполняющихся над кодом. Таким образом, создается и совершено 10 независимых транзакций. Но все 10 разных организаций я не связываю их с их соответствующими транзакциями; так как JPA может это исправить!
Основываясь на ответах; мы имеем ниже; мы говорим, что у нас должен быть экземпляр EntityManager для потока? Не будет ли это убийство на сервере! Должны ли мы объединять эти экземпляры? Не будет ли это равносильно повторению реализации пула соединений?
Что вы подразумеваете под «какой транзакцией»? EM имеет единую (локальную) транзакцию в любое время; он не имеет нескольких. Совместное использование одного EM в нескольких потоках - это рецепт проблем, поскольку он не гарантируется потокобезопасностью. – DataNucleus
http://docs.jboss.org/hibernate/orm/4.0/hem/en-US/html/transactions.html EntityManagerFactory - это дорогостоящий, потокобезопасный объект, предназначенный для совместного использования всеми потоками приложений. Он создается один раз, обычно при запуске приложения. EntityManager - недорогой, не-потоковый объект, который должен использоваться один раз, для одного бизнес-процесса, одной единицы работы, а затем отбрасывается – Deepak
. я понимаю, что создание EntityManager является легким, но все же не очень легким, что для каждой небольшой операции с БД мы ее создаем. Предлагаемое решение - создать EM для каждого запроса. Итак, похоже, что он должен быть на уровне ThreadLocal. – Deepak