Поменяйте местами два элемента в списке, используя JDO в Google Appengine - PullRequest
1 голос
/ 17 ноября 2009

У меня есть TestEntity, у которого есть ArrayList of ChildEntities. Они вступают в личные отношения. я бы хотел получить сущность из хранилища данных, обновить поле int у дочернего элемента объекта, а затем поменяйте местами положение двух дочерних объектов. Однако, как только я меняю сущности, создается впечатление, что обновления в поле int удаляются. Мне не разрешено хранить JDO сохраненный объект во временной переменной, чтобы сделать обмен? Вот мой тест код, а затем определения самих сущностей. Когда я пошагово просматривая код в отладчике, мой ChildEntity перезаписывается или сбросить или что-то еще, как только я скопирую 2-е значение в позицию 0 в списке. Боюсь, что-то в том, как работает 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;
        } 

1 Ответ

0 голосов
/ 18 ноября 2009

Попробуйте добавить defaultFetchGroup = "true" в аннотацию @Persistent над TestEntity.childEntities

По умолчанию childEntities не извлекаются из хранилища данных (насколько я знаю, это поведение JDO, ничего особенного для AppEngine). В вашем случае, я полагаю, они даже не написаны, потому что вы вызываете makePersistent перед тем, как добавлять детей.

...