具有嵌入式实体类的pojo

时间:2015-01-26 18:45:50

标签: google-cloud-datastore objectify

我们有以下情况:Objectify v5中的实体和pojo。 如您所见,实体类具有对pojo的引用,如下所示:

@Entity
public class TestCustomer {

    @Id
    public Long id;

    TestIbj ibj;
}

class TestIbj {
    TestCustomer customer;
}

当我们尝试像这样保存时,这会导致StackOverflowError失败:

TestCustomer testCustomer = new TestCustomer();
OfyService.ofy().save().entity(testCustomer).now();

错误:

java.lang.StackOverflowError
at java.lang.Class.getMethod0(Class.java:2772)
at java.lang.Class.isCheckMemberAccessOverridden(Class.java:2214)
at java.lang.Class.checkMemberAccess(Class.java:2233)
at java.lang.Class.getDeclaredMethods(Class.java:1854)
at... 

我们的问题是:为什么这不允许/失败?如果我们将pojo更改为Entity,它可以正常工作,但我们不明白为什么会这样......

非常感谢!

1 个答案:

答案 0 :(得分:2)

StackoverflowError几乎总是意味着存在无限递归。在您的代码中也是如此:

@Entity
public class TestCustomer {
    @Id
    public Long id;
    TestIbj ibj;  // TestCustomer contains TestIbj
}

class TestIbj {
    TestCustomer customer;  // TestIbj contains TestCustomer (which further contains TestIbj.. and so on)
}

由于这种循环依赖(如上面的代码所示),objectify将永远无法构造对象图。