Jpa EntityTransaction回滚
我使用EJB向数据库插入/更新数据,我遇到了这个问题。我的提交仅适用于更新(合并),但不回滚插入(持久化)。更重要的是,我的插入(持久化)发生在事务提交之前 我的持久性单位:Jpa EntityTransaction回滚,jpa,jboss,transactions,ejb,Jpa,Jboss,Transactions,Ejb,我使用EJB向数据库插入/更新数据,我遇到了这个问题。我的提交仅适用于更新(合并),但不回滚插入(持久化)。更重要的是,我的插入(持久化)发生在事务提交之前 我的持久性单位: <persistence-unit name="bpmBeans_RESOURCE_LOCAL" transaction-type="RESOURCE_LOCAL"> <jta-data-source>java:jboss/datasources/java_orgstruct</jta-da
<persistence-unit name="bpmBeans_RESOURCE_LOCAL" transaction-type="RESOURCE_LOCAL">
<jta-data-source>java:jboss/datasources/java_orgstruct</jta-data-source>
<properties>
<property name="hibernate.hbm2ddl.auto" value="update" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.connection.useUnicode" value="true"/>
<property name="hibernate.connection.characterEncoding" value="UTF-8"/>
<property name="hibernate.connection.CharSet" value="utf8"/>
<property name="hibernate.cache.use_second_level_cache" value="true" />
<property name="hibernate.cache.use_query_cache" value="true" />
<property name="hibernate.transaction.factory_class" value="org.hibernate.transaction.JTATransactionFactory" />
<property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup"/>
<property name="hibernate.connection.autocommit" value="false"/>
</properties>
</persistence-unit>
代码会发生什么
EntityManager em = emf.createEntityManager();
EntityTransaction ets = em.getTransaction();
ets.begin();
Process newObj = new Process();
em.persist(newObj); //data gets inserted at this moment, not at commit
...
...
if(allgood){
ets.commit();// now update(merge, setters on managed entities) would happend.
} else {
ets.rollback(); // this would rollback the updates, but not the insert
}
有什么想法可以试试吗?我想我只是对JPA的一些概念理解得很糟糕
编辑:
数据源代码。数据源在WEB-INF/mysql-ds.xml文件中描述。jar在JBoss部署中
<?xml version="1.0" encoding="UTF-8"?>
<datasources xmlns="http://www.jboss.org/ironjacamar/schema">
<datasource jndi-name="java:jboss/datasources/java_orgstruct" pool-name="MySQLPool">
<connection-url>jdbc:mysql://192.168.150.141/organisation_model</connection-url>
<connection-property name="zeroDateTimeBehavior">convertToNull</connection-property>
<connection-property name="characterEncoding">utf8</connection-property>
<driver>mysql-connector-java-5.1.28-bin.jar</driver>
<security>
<user-name></user-name>
<password></password>
</security>
</datasource>
</datasources>
jdbc:mysql://192.168.150.141/organisation_model
敞篷车
utf8
mysql-connector-java-5.1.28-bin.jar
我认为您不应该将persistence.xml中的jta数据源标记与资源本地事务类型一起使用。有关详细信息,请参阅。我也不确定hibernate.transaction设置如何与resource_local trans类型交互。默认值是否不足以允许您使用em.getTransaction()控制事务?设置为非jta数据源标记没有帮助。我的数据源在应用程序中进行了描述,现在我将添加代码。似乎删除和更新查询发生在commit()上/之后,但插入(无论是使用.merge()还是.persist())都会在该命令之后立即发生。有什么想法吗?你也删除了我提到的JTA设置了吗?如果是,请显示您现在正在使用的内容。另外,您如何确定在调用persist时会发生提交,以及在删除和更新时使用什么代码?如果在合并和删除之后调用em.flush(),那么如果调用ets.rollback(),它们还会回滚吗?为什么要将hibernate.connection.autocommit属性设置为false和其他hibernate.connection属性?您是否先尝试了一个简单的测试,然后添加了您绝对需要的属性?
<?xml version="1.0" encoding="UTF-8"?>
<datasources xmlns="http://www.jboss.org/ironjacamar/schema">
<datasource jndi-name="java:jboss/datasources/java_orgstruct" pool-name="MySQLPool">
<connection-url>jdbc:mysql://192.168.150.141/organisation_model</connection-url>
<connection-property name="zeroDateTimeBehavior">convertToNull</connection-property>
<connection-property name="characterEncoding">utf8</connection-property>
<driver>mysql-connector-java-5.1.28-bin.jar</driver>
<security>
<user-name></user-name>
<password></password>
</security>
</datasource>
</datasources>