我正在尝试开发一个使用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?
答案 0 :(得分:1)
在SE中,您必须小心,只在整个应用程序中使用一个EntityManager实例。使用类似于管理该实例的单一矿石。
您还必须手动管理交易&#34; - 像:
em.getTransaction().begin();
em.persist(anyobject);
em.getTransaction().commit();