gpt4 book ai didi

java - 在 Java SE 应用程序中使用 JPA 支持事务

转载 作者:行者123 更新时间:2023-11-30 06:37:51 26 4
gpt4 key购买 nike

我正在尝试开发一个使用 JPA 的小程序,但可以在没有应用程序服务器的情况下运行,即作为常规 Java SE 应用程序。

据我所知,对于 JavaEE,应用程序服务器负责启动和结束数据库事务。现在我的问题是我从使用 JPA 的一些内部代码中收到此错误:

Exception in thread "main" javax.persistence.TransactionRequiredException: no transaction is in progress
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.checkTransactionNeeded(AbstractEntityManagerImpl.java:1171)
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:1332)
at <see below>

导致此异常的代码相当于:

String persistenceUnitName; // actually comes from some config file
EntityManager entityManager = Persistence.createEntityManagerFactory(persistenceUnitName).createEntityManager();
entityManager.flush(); // exception is thrown here

我无法更改该代码,因此它依赖于自动启动的事务。

将对上述代码的调用包装在自定义事务中,如下所示:

String persistenceUnitName; // same persistence unit name
EntityManager entityManager = Persistence.createEntityManagerFactory(persistenceUnitName).createEntityManager();
entityManager.getTransaction().begin();
callAboveCode();
entityManager.getTransaction().commit();

没有帮助。对工厂的 createEntityManager() 的调用每次都会返回一个新的实体管理器,我认为会产生不同的持久性上下文。

有没有办法在 Java SE 应用程序中实现自动事务处理,类似于在应用程序服务器中运行 JPA?

最佳答案

在 SE 中,您必须小心,在整个应用程序中仅使用 EntityManager 的一个实例。使用类似的单一矿石来管理该实例。

您还必须“手动”管理事务 - 例如:

em.getTransaction().begin();
em.persist(anyobject);
em.getTransaction().commit();

关于java - 在 Java SE 应用程序中使用 JPA 支持事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44909494/

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