2009-11-17 5 views
1

나는 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; 
     } 

답변

0

봅니다 (이것은 내가 아는 한, 아무것도 특정 JDO 동작입니다 AppEngine에). 귀하의 경우에는, 당신이 자녀를 추가하기 전에 makePersistent를 호출하기 때문에 작성되지 않은 것으로 가정합니다.

관련 문제