2013-07-10 2 views
0

EntityManager "em"이라는 개체가 있고 em.flush()을 호출하면 아무 일도 일어나지 않습니다. 현재 거래가 flush (즉,이 시점에서 데이터베이스에 기록 된 데이터)으로 예상됩니다. 왜 그렇게되지 않습니까?JPA 1.0/AppEngine에서 EntityManager.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> 

AppEngine SDK v1.7.4의 JPA/JDO 1.0 로컬 데이터 스토어에서이 줄에 중단 점을 설정하여 테스트 중입니다. 주석은 AppEngine API에서 생성 된 localhost 웹 인터페이스의 데이터를 확인하는 동안 객체는 EntityManager를 닫을 때까지 저장되지 않습니다.

두 App Engine을 동시에 인스턴스화하여 프로덕션 AppEngine에서이 테스트를 수행 했으므로 두 번째 EntityManager가 em.flush() 행 다음에 읽기를 수행합니다. 테스트 방법이 좋은지 잘 모르겠다. (당신은 두 개의 EntityManager를 가질 수 있는가?) 결과를 신뢰할 수 있을지 확신 할 수 없다.

답변

0

이전 (지원되지 않음) 코드 (예 : JPA1 GAE)를 사용하고 있습니다. 엔티티의 공개 필드를 업데이트하고 있습니다 (JPA 사양 및 잘못된 방법으로 인해 잘못되었습니다).

해결책은 간단하다 : (거의 2 년 전에 출시) JPA2 GAE를 사용하고, 공공 기관의 필드 업데이트되지 않습니다 (사용 세터를, 또는 DataNucleus "PersistenceAware"확장자를 사용)

+0

업데이트 코드 클래스는 @PersistenceAware라는 태그가 붙어있어 공개 필드가 작동합니다. getter/setter 및 JPA2로 변환하는 것은 아마도 2 주 정도의 작업 일 것입니다. 따라서 "단순한 해결책"이라고 말하지는 않을 것입니다. 그러나 이것이 유일한 것임을 짐작하고 있습니다. – Nilzor

관련 문제