0

Morphia on Play で @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であると感じていますが、その理由がわからないため、混乱しています。前もって感謝します。

ポール

4

2 に答える 2

2

新しいバージョンの morphia では、内部クラスを 'static' として宣言する必要があることについて、より適切なエラー メッセージが表示されます。それがここの問題です。

public static class ObjectPermission { ...

于 2011-12-12T15:38:12.210 に答える
-1

私が覚えているように、@Embeddableでクラスに注釈を付け、@Embeddedとしての参照のみを注釈する必要があります。ただし、通常は、単一のオブジェクトへの参照を使用してこれを行います。コレクション全体を埋め込むことはできないと思います。@OneToMany を使用して Objectpermission をマップする必要があります。これにより、別のマッピング テーブルが作成されます。

于 2011-12-12T14:58:18.140 に答える