可以在同一应用程序中使用@PersistenceUnit和@PersistenceContext

时间:2019-10-31 18:15:25

标签: spring hibernate

我继承了一个应用程序,并且persistence.xml具有以下内容:

    <persistence-unit name="nxPersistenceUnit" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <non-jta-data-source>someDSName</non-jta-data-source>

代码使用@PersistenceUnit和@PersistenceContext,但我正在阅读for transaction-type =“ RESOURCE_LOCAL”,仅应使用@PersistenceUnit。该应用程序似乎运行正常,大部分时间都使用@PersistenceContext,因此我对他们为什么不使用transaction-type =“ JTA”感到困惑。

我不愿意更改工作代码,但是我们注意到了性能问题,因此我想知道这种混合使用是否可以起到促进作用。

1 个答案:

答案 0 :(得分:1)

实际上,这是完全独立的概念。

  1. 关于交易类型。正如spring documentation所说
  

通常,仅当您的应用程序需要处理跨多个资源的事务时才需要应用程序服务器的JTA功能,而这并不是许多应用程序所必需的。许多高端应用程序都使用单个高度可扩展的数据库(例如Oracle RAC)。

  1. 关于@PersistenceUnit@PersistenceContext

当您需要使用EntityManagerFactory时,应该使用@PersistenceUnit。 当您需要使用EntityManager时,应该使用@PersistenceContext

顺便说一句,JPA 2允许您从现有的EntityManagerFactory获得EntityManager。参见方法EntityManager.getEntityManagerFactory()

另请参阅this