2009-11-17 23 views
1

我有一个TestEntity,它具有ChildEntities的ArrayList。他们加入了一种拥有的关系。我想要 从数据存储中获取实体,更新子实体中的int字段,然后交换两个子实体的位置。但是,只要我交换实体,就好像清除了int字段的更新。我不允许将一个JDO 持久对象存储在一个临时变量中以进行交换吗?这里是我的测试代码 ,后面是实体本身的定义。当我在调试器中遍历代码时,我的ChildEntity将被覆盖 或重置,或者只要我将第二个值复制到列表中的位置0。我担心JDO的工作原理会丢失。使用Google Appengine上的JDO交换列表中的两个元素

@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

尝试增加defaultFetchGroup =“true”以@Persistent注释以上TestEntity.childEntities

默认情况下,childEntities不是从数据存储获取(它是JDO的行为,据我所知,没有什么具体的到AppEngine)。在你的情况下,我想,他们甚至没有写,因为你在添加子项之前调用了makePersistent。