@Embedded参考实体给java.lang.stackoverflow

时间:2011-12-12 14:30:58

标签: mongodb playframework morphia

尝试在Play上使用Morphia中的@Embedded对象时出现以下错误。

A java.lang.StackOverflowError has been caught, null Hide trace
java.lang.StackOverflowError
at java.util.LinkedHashMap.init(LinkedHashMap.java:223)
at java.util.HashMap.(HashMap.java:210)
at java.util.LinkedHashMap.(LinkedHashMap.java:181)
at org.bson.BasicBSONObject.(BasicBSONObject.java:39)
at com.mongodb.BasicDBObject.(BasicDBObject.java:42)
at com.google.code.morphia.mapping.Mapper.toDBObject(Mapper.java:435)
at com.google.code.morphia.mapping.Mapper.toDBObject(Mapper.java:430)
at com.google.code.morphia.mapping.EmbeddedMapper.writeCollection(EmbeddedMapper.java:68)
at com.google.code.morphia.mapping.EmbeddedMapper.toDBObject(EmbeddedMapper.java:30)

这是因为尝试保存以下类的实例:

@Entity
public class Profile extends Model
{
@Embedded
public class ObjectPermission
{
    public String type;
    public ArrayList<String> viewable;
    public ArrayList<String> editable;
}

public String _sfid;
public String _type;
@Embedded
public ArrayList<ObjectPermission> object;
}

我们试图通过以下方式保存它:

@Test
public void TestFullProfileSave()
{
    Profile p = new Profile();
    p._sfid = "0123456789101213145";
    p._type = "entitlements";
    ObjectPermission objPerm = p.new ObjectPermission();
    objPerm.type = "Account";
    objPerm.viewable = new ArrayList<String>();
    objPerm.viewable.add("field1");
    objPerm.viewable.add("field2");
    objPerm.editable = new ArrayList<String>();
    objPerm.editable.add("field3");
    objPerm.editable.add("field4");
    p.object = new ArrayList<ObjectPermission>();
    p.object.add(objPerm);
    p.save();
}

我感觉它是ArrayLists,但不知道为什么我的混乱。提前谢谢。

2 个答案:

答案 0 :(得分:2)

在较新版本的morphia中,您将获得有关需要将内部类声明为“静态”的更好的错误消息。这就是问题所在。

  

public static 类ObjectPermission {...

答案 1 :(得分:-1)

我记得你必须使用@Embeddable注释该类,并且仅将引用注释为@Embedded。 但通常你会通过引用单个对象来做到这一点。我不认为你可以嵌入整个系列。您应该使用@OneToMany来映射Objectpermission。这将导致一个单独的映射表。