gpt4 book ai didi

java - JPA中的事务实现

转载 作者:行者123 更新时间:2023-11-29 00:17:37 25 4
gpt4 key购买 nike

我想了解什么是 JPA 中的事务。

假设我有一个持久性部署到 glassfish 的应用程序:

<?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="survex" transaction-type="JTA">
<jta-data-source>jdbc/MyDatabase</jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
</properties>
</persistence-unit>
</persistence>

我正在尝试调试对 MySQL 服务器的代码嗅探请求:

public String create() {

EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("survex");
EntityManager em = entityManagerFactory.createEntityManager();
Log log = em.find(Log.class, 1);

EntityTransaction transaction = em.getTransaction();
transaction.begin(); // NOTING HAPPENS ...
log.setMessage("xxx");
em.flush(); // OH, HERE IT IS -> SET autocommit=0; UPDATE LOG SET message = 'xxx' WHERE (id = 1)
log.setMessage("aaa");
em.flush(); // OK -> UPDATE LOG SET message = 'aaa' WHERE (id = 1)
transaction.commit(); // NOTHING HAPPENS! WHERE IS COMMIT?!

log = em.find(Log.class, 1);

transaction = em.getTransaction();
transaction.begin(); // STILL NOTHING ...
log.setMessage("555");
em.flush(); // UPDATE LOG SET message = '555' WHERE (id = 1)
log.setMessage("666");
em.flush(); // UPDATE LOG SET message = '666' WHERE (id = 1)
transaction.commit(); // NOTHING!!!

return log.getMessage();
}
// SOMEWHERE OUTSIDE: COMMIT; SET autocommit=1;

为什么?!为什么 JPA 的行为如此奇怪?

我希望每次调用 transaction.commit() 时都提交,或者我误解了什么?

最佳答案

我在您的代码中看到一个问题:您将 PersistenceContext 定义为 JTA,但使用 RESOURCE_LOCAL 事务 API(即 EntityManager.getTransaction())。

当您处于 Java EE 环境中时,只需获取 UserTransaction 的注入(inject)实例:@Resource private UserTransaction transaction;EntityManager 而不是创建一个。您还应该禁用 CMT(容器管理)事务,否则它们会自动打开/关闭。

关于java - JPA中的事务实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22389953/

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