persistence.xml different transaction-type attributes

徘徊边缘 提交于 2019-11-26 12:49:39

问题


In the persistence.xml JPA configuration file, you can have a line like:

<persistence-unit name=\"com.nz_war_1.0-SNAPSHOTPU\" transaction-type=\"JTA\">

or sometimes:

<persistence-unit name=\"com.nz_war_1.0-SNAPSHOTPU\" transaction-type=”RESOURCE_LOCAL”>

My question is:

What is the difference between transaction-type=\"JTA\" and transaction-type=”RESOURCE_LOCAL” ?

I also noticed some persistence.xml files with the transaction-type missing. Is it correct?


回答1:


Defaults

Default to JTA in a JavaEE environment and to RESOURCE_LOCAL in a JavaSE environment.

RESOURCE_LOCAL

With <persistence-unit transaction-type="RESOURCE_LOCAL"> you are responsible for EntityManager (PersistenceContext/Cache) creating and tracking

  • You must use the EntityManagerFactory to get an EntityManager
  • The resulting EntityManager instance is a PersistenceContext/Cache An EntityManagerFactory can be injected via the @PersistenceUnit annotation only (not @PersistenceContext)
  • You are not allowed to use @PersistenceContext to refer to a unit of type RESOURCE_LOCAL
  • You must use the EntityTransaction API to begin/commit around every call to your EntityManger
  • Calling entityManagerFactory.createEntityManager() twice results in two separate EntityManager instances and therefor two separate PersistenceContexts/Caches.
  • It is almost never a good idea to have more than one instance of an EntityManager in use (don't create a second one unless you've destroyed the first)

JTA

With <persistence-unit transaction-type="JTA"> the container will do EntityManager (PersistenceContext/Cache) creating and tracking.

  • You cannot use the EntityManagerFactory to get an EntityManager
  • You can only get an EntityManager supplied by the container
  • An EntityManager can be injected via the @PersistenceContext annotation only (not @PersistenceUnit)
  • You are not allowed to use @PersistenceUnit to refer to a unit of type JTA
  • The EntityManager given by the container is a reference to the PersistenceContext/Cache associated with a JTA Transaction.
  • If no JTA transaction is in progress, the EntityManager cannot be used because there is no PersistenceContext/Cache.
  • Everyone with an EntityManager reference to the same unit in the same transaction will automatically have a reference to the same PersistenceContext/Cache
  • The PersistenceContext/Cache is flushed and cleared at JTA commit time


来源:https://stackoverflow.com/questions/17331024/persistence-xml-different-transaction-type-attributes

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!