Когда у меня есть объект EntityManager с именем «em» и звоните em.flush()
, ничего не происходит. Я ожидал, что текущая транзакция будет flush - то есть данные, записанные в базу данных на данный момент. Почему это не происходит?Почему не работает EntityManager.flush() в JPA 1.0/AppEngine?
Это бизнес-класс, я работаю с:
@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>
Я тестирую его в локальном хранилище для AppEngine SDK v1.7.4 с JPA/JDO 1.0, установив точку останова на линии с помощью комментарий при проверке данных с веб-интерфейса localhost, созданного API AppEngine. Объект не сохраняется до закрытия EntityManager.
Я также проверил это на производстве AppEngine, создав одновременно два EntityManager, чтобы второй EntityManager выполнил чтение после строки em.flush()
. Я не уверен, что тестовый метод хорош, хотя (может быть, у вас есть два EntityManager?), Поэтому я не уверен, могу ли я доверять результатам.
Класса с кодом обновления является помечены с помощью @PersistenceAware, поэтому работа в публичном поле работает. Преобразование в getter/seters и JPA2, вероятно, будет работать на пару недель, поэтому я не буду говорить, что это «простое решение», но я предполагаю, что это единственный. – Nilzor