2013-07-10 2 views
0

Когда у меня есть объект 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?), Поэтому я не уверен, могу ли я доверять результатам.

ответ

0

Используется старый (неподдерживаемый) код (т. Е. JPA1 GAE). Вы обновляете публичные поля Entities (недействительными по спецификации JPA и в любом случае плохой практике).

Решения просто: использовать JPA2 GAE (выпущенный почти 2 лет назад), а не обновлять публичные поля лиц (использование сеттер, или использовать DataNucleus «PersistenceAware» расширение)

+0

Класса с кодом обновления является помечены с помощью @PersistenceAware, поэтому работа в публичном поле работает. Преобразование в getter/seters и JPA2, вероятно, будет работать на пару недель, поэтому я не буду говорить, что это «простое решение», но я предполагаю, что это единственный. – Nilzor

Смежные вопросы