如何让我的项目使用容器管理的Enitymanager生命周期,而不是应用程序管理的生命周期



我已经做了一段时间了,希望能得到一些帮助。第一个persistence.xml给出了下面的输出。另一个persistente.xml崩溃为:javax.persistence.PersistenceException: No Persistence provider for EntityManager named com.topcat_mavenproject1_jar_1.0-SNAPSHOTPU请告诉我是否有什么可以让它更清晰。

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import javax.persistence.PersistenceContext;

@Stateless
public class NewClass {
@PersistenceContext(unitName ="com.topcat_mavenproject1_jar_1.0-SNAPSHOTPU")
static EntityManager containerManagedEntityManager;
public static void main(String[] args) {
    EntityManagerFactory emf = Persistence.createEntityManagerFactory(
            "com.topcat_mavenproject1_jar_1.0-SNAPSHOTPU");
    EntityManager applicationManagedEntityManager = emf.createEntityManager();
    System.out.println("Container managed entityManager: "+containerManagedEntityManager);
    System.out.println(  "Application managed entityManager: " +applicationManagedEntityManager);
    }
}

输出:

[EL Info]: 2016-08-16 01:51:13.395--ServerSession(33510911)--EclipseLink, version: Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd
[EL Info]: connection: 2016-08-16 01:51:13.535--ServerSession(33510911)--file:/Users/me/NetBeansProjects/mavenproject1/target/classes/_com.topcat_mavenproject1_jar_1.0-SNAPSHOTPU login successful
[EL Warning]: metamodel: 2016-08-16 01:51:13.552--The collection of metamodel types is empty. Model classes may not have been found during entity search for Java SE and some Java EE container managed persistence units.  Please verify that your entity classes are referenced in persistence.xml using either <class> elements or a global <exclude-unlisted-classes>false</exclude-unlisted-classes> element
Container managed entityManager: null
Application managed entityManager: org.eclipse.persistence.internal.jpa.EntityManagerImpl@6f139fc9

我的持久性.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1"  xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="com.topcat_mavenproject1_jar_1.0-SNAPSHOTPU" transaction-type="RESOURCE_LOCAL">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<properties>
  <property name="javax.persistence.jdbc.url" value="jdbc:derby://localhost:1527/nutrition_DB"/>
  <property name="javax.persistence.jdbc.user" value="app"/>
  <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.ClientDriver"/>
  <property name="javax.persistence.jdbc.password" value="pass"/>
  <property name="javax.persistence.schema-generation.database.action" value="create"/>
</properties>

备用持久性.xml:

<persistence version="2.1"    xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
  <persistence-unit name="persistenceUnit" transaction-type="JTA">
  <jta-data-source>jdbc/dataSource</jta-data-source>
    <class>test.domain.TestEntity</class>
</persistence-unit>
</persistence>

为了拥有容器管理的实体管理器,您应该使用Java Transaction API(JTA(而不是RESOURCE_LOCAL。它们之间的区别是:

  • JTA表示持久性由应用程序服务器管理
  • RESOURCE_LOCAL表示持久性由您自己管理

您可以将Persistence单元看作RESOURCE_LOCAL还是JTA?

因此,在您的情况下,我建议您执行以下操作:

  1. 确保您处于Java EE环境中,例如Tomcat、WildFly,而不是Java SE
  2. 修改PU com.topcat_mavenproject1_jar_1.0-SNAPSHOTPU,设置transaction-type="JTA"
  3. 确保您的JTA数据源(DS(已在服务器中配置并激活
  4. 在标记jta-data-source中的持久性XML中描述此数据源
  5. 使用PersistenceContextEntityManager注入到java类中。由于持久性是由应用程序服务器管理的,除非您确切地知道自己在做什么,否则不要再使用实体管理器工厂

然而,您似乎处于JavaSE环境中。在这种情况下,没有任何Java EE容器(应用程序服务器(。因此,您不能从JTA配置中获益:(您必须使用RESOURCE_LOCAL模式并自己管理所有内容。

最新更新