gpt4 book ai didi

jpa - 使用 JTA 时无法使用 EntityTransaction

转载 作者:行者123 更新时间:2023-12-02 07:56:22 26 4
gpt4 key购买 nike

我收到此错误:

javax.servlet.ServletException: java.lang.IllegalStateException: 
Exception Description: Cannot use an EntityTransaction while using JTA.

在尝试使用 JPA 和 JAVAEE、Glassfish 时。

我的 persistence.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="acmeauction">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>jdbc/MySQLJDBCResource</jta-data-source>
<class>it.uniroma3.acme.auction.model.User</class>
<class>it.uniroma3.acme.auction.model.Auction</class>
<properties>
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/acmeauction"/>
<property name="javax.persistence.jdbc.user" value="user"/>
<property name="javax.persistence.jdbc.password" value="password"/>
</properties>
</persistence-unit>
</persistence>

我想做的是以这种方式持久保存一个对象(用户):

@ManagedBean
public class UserRepository implements Serializable{

@PersistenceUnit
EntityManagerFactory emf;

@PersistenceContext
private EntityManager em;

private static UserRepository instance;

/**
* Gives back the singleton UserRepository singleton.
*/
public static UserRepository getInstance() {
if (instance==null) {
instance = new UserRepository();
}
return instance;
}

private UserRepository() {
emf = Persistence.createEntityManagerFactory("acmeauction");
em = emf.createEntityManager();
}

/**
* Save and persist a new User.
*/
public void save(User user) {
em.getTransaction().begin();
em.persist(user);
em.getTransaction().commit();
}
}

如果它尝试从简单的 Java 应用程序使用 UserRepository,则它可以正常工作。

提前致谢,AN

最佳答案

您不应使用 em.getTransaction().begin(); 也不应使用 em.getTransaction().commit();,这些说明应与 RESOURCE_LOCAL 事务类型一起使用。

在您的情况下,事务由容器管理,在您的方法中第一次使用 EntitiyManager 时,容器检查是否存在事件事务,如果没有事件事务然后它创建一个,当方法调用结束时,容器将提交事务。所以,最后你的方法应该如下所示:

public void save(User user) {
em.persist(user);
}

容器负责处理事务,即 JTA。

关于jpa - 使用 JTA 时无法使用 EntityTransaction,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10915855/

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