Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jpa 创建应用程序管理的JTA EntityManager_Jpa_Glassfish_Eclipselink_Entitymanager - Fatal编程技术网

Jpa 创建应用程序管理的JTA EntityManager

Jpa 创建应用程序管理的JTA EntityManager,jpa,glassfish,eclipselink,entitymanager,Jpa,Glassfish,Eclipselink,Entitymanager,我使用的是Glassfish 3.1.2、JPA2.0和eclipselink。我正在尝试创建一个应用程序管理的EntityManager。persistence.xml文件中持久化单元的事务类型指定为“JTA” 然后创建一个EnityManager作为 EntityManager em = emf.createEntityManager(); 问题是:我这样得到的实体经理是JTA吗?我尝试了这一点,并且我能够在实体管理器上调用getTransaction()方法,没有例外,据我所知,JTA实

我使用的是Glassfish 3.1.2、JPA2.0和eclipselink。我正在尝试创建一个应用程序管理的EntityManager。persistence.xml文件中持久化单元的事务类型指定为“JTA”

然后创建一个EnityManager作为

EntityManager em = emf.createEntityManager();
问题是:我这样得到的实体经理是JTA吗?我尝试了这一点,并且我能够在实体管理器上调用getTransaction()方法,没有例外,据我所知,JTA实体管理器不允许这样做。另外,如果我在bean管理的事务中使用这个实体管理器(在事务开始后创建实体管理器),那么在提交用户事务之后,数据库中不会有任何持久化的内容

我知道我们应该注入实体管理器和实体管理器工厂,但我想了解这种行为

persistence.xml如下所示:

    <persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
      <persistence-unit name="myPU" transaction-type="JTA">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <jta-data-source>java:app/jdbc/myDatasource</jta-data-source>
        <class>example.MyEntity</class>  
        <properties>
          <property name="eclipselink.ddl-generation.output-mode" value="sql-script"/>
          <property name="eclipselink.application-location" value="C:\gen-ddl"/>      
        </properties>
      </persistence-unit>
    </persistence>
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE resources PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Resource Definitions//EN" 
    "http://glassfish.org/dtds/glassfish-resources_1_5.dtd">
    <resources>
        <jdbc-connection-pool  name="MyDB_Pool" datasource-classname="oracle.jdbc.pool.OracleDataSource" res-type="javax.sql.DataSource">
            <property name="url" value="jdbc:oracle:thin:@192.168.xxx.xxx:1521:xxx"/>
            <property name="user" value="xxx"/>
            <property name="password" value="xxx"/>
        </jdbc-connection-pool>

        <jdbc-resource 
            enabled="true" 
            jndi-name="java:app/jdbc/myDatasource" 
            object-type="user" 
            pool-name="MyDB_Pool"/>
    </resources> 

org.eclipse.persistence.jpa.PersistenceProvider
java:app/jdbc/myDatasource
例如:我的实体
我在EAR项目中定义数据源的glassfish-resource.xml文件如下所示:

    <persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
      <persistence-unit name="myPU" transaction-type="JTA">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <jta-data-source>java:app/jdbc/myDatasource</jta-data-source>
        <class>example.MyEntity</class>  
        <properties>
          <property name="eclipselink.ddl-generation.output-mode" value="sql-script"/>
          <property name="eclipselink.application-location" value="C:\gen-ddl"/>      
        </properties>
      </persistence-unit>
    </persistence>
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE resources PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Resource Definitions//EN" 
    "http://glassfish.org/dtds/glassfish-resources_1_5.dtd">
    <resources>
        <jdbc-connection-pool  name="MyDB_Pool" datasource-classname="oracle.jdbc.pool.OracleDataSource" res-type="javax.sql.DataSource">
            <property name="url" value="jdbc:oracle:thin:@192.168.xxx.xxx:1521:xxx"/>
            <property name="user" value="xxx"/>
            <property name="password" value="xxx"/>
        </jdbc-connection-pool>

        <jdbc-resource 
            enabled="true" 
            jndi-name="java:app/jdbc/myDatasource" 
            object-type="user" 
            pool-name="MyDB_Pool"/>
    </resources> 

检查并包含persistence.xml。您是使用JTA数据源还是指定JDBC连接

如果要使用JTA,则必须使用JTA数据源,否则需要使用RESOURCE_LOCAL


如果在JTA事务启动后创建EntityManager,它应该自动加入事务。否则,您需要调用joinTransaction()。

将persistence.xml和数据源定义添加到原始POST中。我认为问题在于yiu需要在持久性中设置“eclipselink.target server”=“Glassfish”。xml@James无需设置您是在尝试访问web层还是EJB层中的EMF?在EJB层中。我尝试了一些不同的东西。我有两个EJB模块(在同一个EAR中有两个独立的JAR)。我将EMF注入一个EJB模块,然后将其传递给另一个EJB模块。调用emf.createEntityManager()会导致IllegalStateException,消息为-找不到持久性单元myPU的EntityManagerFactory。这是预期的吗?通过Persistence.createEntityManagerFactory(“myPU”)获取EntityManagerFactory与将其注入之间的区别在于,第一种情况下获取EntityManagerImpl实例,而第二种情况下获取EntityManagerRapper实例。