나는 ChildEntities의 ArrayList를 가진 TestEntity를 가지고있다. 그들은 소유 관계에 합류했습니다. 나는 데이터 저장소에서 엔티티를 가져오고 자식 엔티티의 int 필드를 업데이트 한 다음 두 개의 자식 엔티티의 위치를 바꿔야합니다. 그러나 엔터티를 교환하는 즉시 int 필드에 대한 업데이트가 지워진 것처럼 보입니다. 스왑을 수행하기 위해 임시 변수에 JDO 지속 객체를 저장하는 것을 허용하지 않습니까? 여기 엔 내 테스트 코드가 있으며, 엔티티 자체의 정의가 뒤 따른다. 내가 디버거의 코드를 단계별로 실행할 때 내 ChildEntity는 을 덮어 쓰거나 목록의 위치 0에 두 번째 값을 복사하자마자 초기화합니다. 나는 JDO가 어떻게 작동하지 않는가에 대해 뭔가 빠져있는 것 같아 걱정된다. defaultFetchGroup이 = "사실은"Google Appengine의 JDO를 사용하여 목록의 두 요소 교환하기
기본적으로, childEntities 데이터 저장소에서 불러올 수 없습니다 TestEntity.childEntities 위의 주석을 @Persistent에 추가
@Test
public void testSwap() {
PersistenceManager pm = PMF.get().getPersistenceManager();
TestEntity te = new TestEntity();
pm.makePersistent(te);
te.getChildEntities().add(new TestChildEntity("a"));
te.getChildEntities().add(new TestChildEntity("b"));
long id = te.getId();
pm.close();
pm = PMF.get().getPersistenceManager();
te = pm.getObjectById(TestEntity.class, id);
List<TestChildEntity> children = te.getChildEntities();
for (TestChildEntity tce : children) {
tce.setFoo(3);
}
TestChildEntity temp = children.get(0);
children.set(0, children.get(1));
// after the above line executes, the object referred to by temp is overwritten/reset when i watch in debugger.
children.set(1, temp);
assertEquals(3, children.get(0).getFoo()); // these asserts will both fail.
assertEquals(3, children.get(1).getFoo());
}
@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class TestEntity {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Long id;
@Persistent(mappedBy = "parent")
private List<TestChildEntity> childEntities;
public List<TestChildEntity> getChildEntities() {
return childEntities;
}
public Long getId() {
return id;
}
public static void demonstrateProblemWithRemove() {
PersistenceManager pm = PMF.get().getPersistenceManager();
TestEntity te = new TestEntity();
pm.makePersistent(te);
te.getChildEntities().add(new TestChildEntity("a"));
te.getChildEntities().remove(0);
pm.close();
}
}
@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class TestChildEntity {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
@Extension(vendorName = "datanucleus", key = "gae.encoded-pk", value
= "true")
private String encodedKey;
@Persistent
@Extension(vendorName = "datanucleus", key = "gae.pk-name", value =
"true")
private String keyName;
@Persistent
private int foo;
@Persistent
private TestEntity parent;
public TestChildEntity(String k) {
this.keyName = k;
this.foo = 1;
}
public int getFoo() {
return foo;
}
public void setFoo(int foo) {
this.foo = foo;
}