【问题标题】:JPA 2 with managed transactions not persisting object具有托管事务的 JPA 2 不持久化对象
【发布时间】:2011-01-14 21:50:30
【问题描述】:

我正在使用 JPA 2 的 OpenJPA 实现,并且在将对象持久保存到数据库时遇到问题。我想使用由容器(Websphere)管理的事务,所以我的理解是,由于事务是受管理的,因此不需要像 tx.begin()、tx.commit() 等样板代码。

 <?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="buildTest" transaction-type="JTA">
        <jta-data-source>jdbc/lfcbuild</jta-data-source>
        <class>entities.Build</class>
        <properties>
            <property name="openjpa.jdbc.Schema" value="APP"/>
            <property name="openjpa.TransactionMode" value="managed"/>
            <property name="openjpa.ConnectionFactoryMode" value="managed"/>                    
        </properties>
    </persistence-unit>
</persistence>

我在持久化构建时正在执行的代码是这样的:

EntityManagerFactory emf = Persistence.createEntityManagerFactory("buildTest");
EntityManager em = emf.createEntityManager();

Build b = new Build();
b.setFirstName("Dick");
b.setLastName("Tracy");

em.persist(b);

代码运行,不抛出异常。当我检查数据库时,没有任何东西被持久化。我是否遗漏了什么,或者这是否足以让对象与容器管理的事务一起存在?

【问题讨论】:

  • 尝试在persistence.xml 中将shared-cache-mode 设置为NONE。不确定 OpenJP,但 EclipseLink 默认使用某种缓存,因此可能并非所有操作都会反映在数据库中。

标签: jpa-2.0 openjpa


【解决方案1】:

该代码是 EJB 的一部分吗?否则,您可能必须以编程方式启动并提交 Tx。

【讨论】:

  • 不,它不是 EJB 的一部分。它实际上是在 OSGi 包中运行的。
  • 似乎实体管理器在 Tx 结束时没有被刷新,因为没有 tx。你能把这段代码放在一个无状态的 EJB 方法中,看看会发生什么吗?如果没有 EJB,您需要样板 tx.begin() 等...
猜你喜欢
  • 2014-11-12
  • 2017-02-17
  • 1970-01-01
  • 2017-10-10
  • 2013-11-08
  • 1970-01-01
  • 2013-02-27
  • 2011-11-28
  • 1970-01-01
相关资源
最近更新 更多