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

时间:2017-07-04 15:16:41

标签: java jpa transactions jpa-2.0

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

AFAIK,对于JavaEE,应用程序服务器负责开始和结束数据库事务。现在我的问题是我从使用JPA的一些内部代码中得到了这个错误:

MainActivity

导致此异常的代码等同于:

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(); 的调用每次都会返回一个新的实体管理器,从而产生一个不同的持久化上下文。

是否有办法获得自动事务处理,类似于在Java SE应用程序中在应用程序服务器中运行JPA?

1 个答案:

答案 0 :(得分:1)

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

您还必须手动管理交易&#34; - 像:

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