我正在使用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托管事务中使用此实体管理器(在事务开始之后创建实体管理器),在提交用户事务后,DB中不会保留任何内容。
我知道我们应该注入实体经理和实体经理工厂,但我想了解这种行为
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>
答案 0 :(得分:1)
检查并包含您的persistence.xml。您使用的是JTA DataSource还是指定了JDBC连接?
如果要使用JTA,则必须使用JTA DataSource,否则需要使用RESOURCE_LOCAL。
如果在JTA事务启动后创建EntityManager,它应自动加入事务。否则,您需要调用joinTransaction()。