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를 가질 수 있는가?) 결과를 신뢰할 수 있을지 확신 할 수 없다.
업데이트 코드 클래스는 @PersistenceAware라는 태그가 붙어있어 공개 필드가 작동합니다. getter/setter 및 JPA2로 변환하는 것은 아마도 2 주 정도의 작업 일 것입니다. 따라서 "단순한 해결책"이라고 말하지는 않을 것입니다. 그러나 이것이 유일한 것임을 짐작하고 있습니다. – Nilzor