2009-11-17 16 views
1

J'ai un TestEntity qui a une ArrayList de ChildEntities. Ils sont rejoints dans une relation de propriété. Je veux obtenir l'entité à partir du magasin de données, mettre à jour un champ int dans l'entité enfant , puis échanger la position des deux entités enfants. Cependant, dès que j'échange les entités, il semble que les mises à jour du champ int sont effacées. Ne suis-je pas autorisé à stocker un objet JDO persistant dans une variable temp pour effectuer le swap? Voici mon code de test , suivi des définitions des Entités elles-mêmes. Lorsque je étape par le code dans le débogueur, mon ChildEntity est écrasé ou réinitialiser ou quoi que ce soit dès que je copie la 2ème valeur en position 0 dans la liste. J'ai peur qu'il y ait quelque chose dans le fonctionnement de JDO qui me manque.Échange de deux éléments dans une liste à l'aide de JDO sur Google Appengine

@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; 
     } 

Répondre

0

Essayez d'ajouter defaultFetchGroup = "true" @Persistent annotation ci-dessus TestEntity.childEntities

Par défaut, childEntities ne sont pas extraites de datastore (ce comportement est JDO, pour autant que je sache, rien de spécifique AppEngine). Dans votre cas, je suppose, ils ne sont même pas écrits parce que vous appelez makePersistent avant d'ajouter des enfants.