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 EntityTransaction回滚_Jpa_Jboss_Transactions_Ejb - Fatal编程技术网

Jpa EntityTransaction回滚

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

我使用EJB向数据库插入/更新数据,我遇到了这个问题。我的提交仅适用于更新(合并),但不回滚插入(持久化)。更重要的是,我的插入(持久化)发生在事务提交之前

我的持久性单位:

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