Unexpected behavior of cascade update when updating collection of child entities

17 views
Skip to first unread message

Georgi Georgiev

unread,
May 7, 2013, 4:54:29 AM5/7/13
to twig-p...@googlegroups.com
Hi,

I used twig last version from repo and I tried cascade update. I tried to update entity which have a collection of children( @Child List<Child> children; ). After the update collection is set to null. I wrote a test to check the behavior, but test failed when it tried to load updated entity.

public class CascadeUpdateTest extends LocalDatastoreTestCase {

  static class Foo {

    @Id
    private Long id;


    @Child
    List<Bar> bar = new ArrayList<Bar>();
  }

  static class Bar {

    @Id
    private Long id;

    String value;

  }

  private ObjectDatastore datastore;

  @Before
  public void setUp() throws Exception {

    ObjectDatastoreFactory.register(Foo.class);
    ObjectDatastoreFactory.register(Bar.class);
    datastore = new AnnotationObjectDatastore(Settings.builder().crossGroupTransactions(false).build());
  }

  @Test
  public void cascadeUpdate() throws Exception {
    Bar bar = new Bar();
    bar.value = "old value";

    Foo foo = new Foo();
    foo.id = 1l;
    foo.bar.add(bar);
    datastore.store(foo);

    datastore.disassociateAll();

    Foo fooForUpdate = datastore.load(Foo.class, 1);

    fooForUpdate.bar.get(0).value= "new value";

    datastore.update(fooForUpdate, true);

    datastore.disassociateAll();

    Foo persistedFoo = datastore.load(Foo.class, 1);

  }
}

java.lang.IllegalStateException: Problem translating field java.util.List com.google.code.twig.CascadeUpdateTest$Foo.bar with properties [[SimpleProperty value=[null] path=bar indexed=false]]
at com.google.code.twig.translator.FieldTranslator.decodeField(FieldTranslator.java:160)
at com.google.code.twig.standard.TranslatorObjectDatastore$ObjectFieldTranslator.decodeField(TranslatorObjectDatastore.java:979)
at com.google.code.twig.translator.FieldTranslator.decode(FieldTranslator.java:124)
at com.google.code.twig.standard.StandardDecodeCommand.entityToInstance(StandardDecodeCommand.java:116)
at com.google.code.twig.standard.StandardDecodeCommand.keyToInstance(StandardDecodeCommand.java:190)
at com.google.code.twig.standard.StandardSingleTypedLoadCommand.keyToInstance(StandardSingleTypedLoadCommand.java:9)
at com.google.code.twig.standard.StandardSingleTypedLoadCommand.now(StandardSingleTypedLoadCommand.java:34)
at com.google.code.twig.standard.TranslatorObjectDatastore.load(TranslatorObjectDatastore.java:239)
at com.google.code.twig.CascadeUpdateTest.cascadeUpdateChildCollection(CascadeUpdateTest.java:70)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:59)
at org.junit.internal.runners.MethodRoadie.runTestMethod(MethodRoadie.java:98)
at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:79)
at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:87)
at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:77)
at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:42)
at org.junit.internal.runners.JUnit4ClassRunner.invokeTestMethod(JUnit4ClassRunner.java:88)
at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:51)
at org.junit.internal.runners.JUnit4ClassRunner$1.run(JUnit4ClassRunner.java:44)
at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:27)
at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:37)
at org.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:42)
at org.junit.runner.JUnitCore.run(JUnitCore.java:130)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:77)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:195)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:63)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
Caused by: java.lang.NullPointerException
at com.google.code.twig.standard.BaseObjectDatastore.getFromMemory(BaseObjectDatastore.java:805)
at com.google.code.twig.standard.BaseObjectDatastore.serviceGet(BaseObjectDatastore.java:621)
at com.google.code.twig.standard.StandardDecodeCommand.keysToEntities(StandardDecodeCommand.java:272)
at com.google.code.twig.standard.StandardDecodeCommand.keysToInstances(StandardDecodeCommand.java:223)
at com.google.code.twig.standard.StandardUntypedMultipleLoadCommand.now(StandardUntypedMultipleLoadCommand.java:21)
at com.google.code.twig.standard.RelationTranslator.keysToInstances(RelationTranslator.java:97)
at com.google.code.twig.standard.RelationTranslator.decode(RelationTranslator.java:55)
at com.google.code.twig.translator.FieldTranslator.decodeField(FieldTranslator.java:155)

Reply all
Reply to author
Forward
0 new messages