当我有一个名为“em”的EntityManagerem.flush()
对象并调用时,什么也没有发生。我期待当前事务刷新- 即此时写入数据库的数据。为什么不发生?
这是我正在使用的商务舱:
@Entity
public class SomeObject {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Long Id;
public String Property1;
public String Property2;
}
这是写入和刷新的测试代码:
public void transactionTest() {
EntityManager em = Database.getEntityManager();
em.getTransaction().begin();
SomeObject obj = new SomeObject();
obj.Id = 2L;
obj.Property1 = "A";
em.persist(obj);
em.flush();
obj.Property2 = "B"; // Breakpoint here, expecting data to have be written
em.getTransaction().commit(); // ...but the data is not written until after this line.
em.close();
}
这是我的persistence.xml
<persistence>
<persistence-unit name="no-xtransactions">
<provider>org.datanucleus.store.appengine.jpa.DatastorePersistenceProvider</provider>
<properties>
<property name="datanucleus.nontx.atomic" value="false"/>
<property name="datanucleus.NontransactionalRead" value="true"/>
<property name="datanucleus.NontransactionalWrite" value="true"/>
<property name="datanucleus.ConnectionURL" value="appengine"/>
<property name="datanucleus.appengine.datastoreEnableXGTransactions" value="false"/>
</properties>
</persistence-unit>
</persistence>
我正在使用 JPA/JDO 1.0 在 AppEngine SDK v1.7.4 的本地数据存储上对其进行测试,方法是在注释行设置断点,同时检查来自 AppEngine API 生成的本地主机 Web 界面的数据。在我关闭 EntityManager 之前,不会存储该对象。
我还通过同时实例化两个 EntityManagers 在生产 AppEngine 上对此进行了测试,以便第二个 EntityManager 在em.flush()
-line 之后进行读取。我不确定测试方法是否很好(你可以有两个 EntityManagers 吗?),所以我不确定我是否可以相信结果。