gpt4 book ai didi

Hibernate 实体管理器在查询之前自动刷新并在事务中提交对数据库的更改

转载 作者:行者123 更新时间:2023-12-02 23:37:56 27 4
gpt4 key购买 nike

我在 Jboss AS 6.0.0 Final 上使用 Hibernate 3.6.0 和 JPA 2。在我的 EJB 中,有一个方法可以更新实体值并对其进行一些查询。整个方法在BMT事务中运行。如果出现任何问题,所有更改都应该回滚,而不是提交到数据库。

数据库是mySql。

在运行 JPA 查询之前,JPA 会自动将更改的状态刷新到数据库,以防止返回任何过时的数据。然而,在我的方法中,自动刷新直接更新并将更改提交到数据库,即使之后出现问题,更改也不会回滚。所以我想问一下我的设置是否有错误的配置或者这是一个错误或其他什么。

EJB

@Stateless(mappedName = "MyManagementBean")
@Local
@TransactionManagement(TransactionManagementType.BEAN)


public class MyManagement implements MyManagementLocal,MyManagementRemote {

@PersistenceUnit(unitName="MyEjb") EntityManagerFactory emf;
@Resource UserTransaction utx;
@Resource SessionContext ctx;

/**
* Default constructor.
*/
public MyManagement () {
// TODO Auto-generated constructor stub
}

public void dosomething(String id) throws Exception
{

try {
utx.begin();
em = emf.createEntityManager();

Myline line = em.find(Myline.class, id);

line.setStatus("R");

Stromg q += " from Myline as line ";
//auto flush apply here and directly committed to DB...
Iterator iter = em.createQuery(q).getResultList().iterator();

em.flush();
utx.commit();// changes should only commit after this
}
catch (Exception e) {
e.printStackTrace();
if (utx != null) utx.rollback();
throw e; // or display error message
}
finally {
em.close();
}
}
}

持久性.xml

<?xml version="1.0" encoding="UTF-8"?>
<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="MyEjb" transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>java:MyDS</jta-data-source>
<class>com.quincy.entity.MyLine</class>

<properties>
<property name="hibernate.connection.defaultNChar" value="true"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLMyISAMDialect"/>
<property name="hibernate.ejb.cfgfile" value="META-INF/hibernate.cfg.xml"/>
</properties>
</persistence-unit>
</persistence>

hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>


<property name="transaction.manager_lookup_class">org.hibernate.transaction.JBossTransactionManagerLookup</property>


<!-- Echo all executed SQL to stdout -->
<property name="show_sql">true</property>

<property name="hibernate.max_fetch_depth">3</property>


</session-factory>
</hibernate-configuration>

mysql-ds.xml

<datasources>

<local-tx-datasource>
<jndi-name>MyDS</jndi-name>
<connection-url>jdbc:mysql://10.10.150.57:3306/myds</connection-url>
<driver-class>com.mysql.jdbc.Driver</driver-class>
<user-name>user</user-name>
<password>pwd</password>
<exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name>
<metadata>
<type-mapping>mySQL</type-mapping>
</metadata>
</local-tx-datasource>
</datasources>

经过进一步调查,我发现每当发生刷新时,脏更改都会直接写入并提交到数据库。如果我删除flush(),一切正常。不过,有系统在查询前触发刷新,我认为这是必要的。

在我看来,数据库是自动提交的。我尝试将属性 hibernate.connection.autocommit 设置为 false 但问题仍然存在,并且会提示 EJB 违反规范的警告。

更新:原因应该来自mysql。就好像我切换到 mssql 服务器一样,问题就消失了。我还尝试使用 xa-datasource mysql,仍然没有运气......

最佳答案

问题已解决。原因是mysql中的表默认使用MyISAM引擎,而使用该引擎的表不支持事务。将表切换到 innoDB 使事情正常进行。希望这对任何人都有用,这样他们就不会像我一样浪费太多时间。 :(

关于Hibernate 实体管理器在查询之前自动刷新并在事务中提交对数据库的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6516973/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com