0

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

<persistence-unit name="myPU" transaction-type="JTA">

在一个 bean 中,我将 EntityManagerFactory 创建为

EntityManagerFactory emf = Persistence.createEntityManagerFactory("myPU");

然后创建一个 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>

我定义数据源的 EAR 项目中的 glassfish-resource.xml 文件如下所示:

    <?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> 
4

1 回答 1

1

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

如果你想使用JTA,那么你必须使用一个JTA DataSource,否则你需要使用RESOURCE_LOCAL。

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

于 2013-09-04T13:19:01.640 回答