@Embedded Справочник по предоставлению сущности java.lang.stackoverflow

У нас возникает следующая ошибка при попытке использовать объект @Embedded в Morphia on Play.

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, но я не знаю, почему, отсюда и мое замешательство. Заранее спасибо.

Павел


person pbattisson    schedule 12.12.2011    source источник


Ответы (2)


В более новых версиях morphia вы получите лучшее сообщение об ошибке о необходимости объявить внутренний класс как «статический». Вот в чем проблема.

общедоступный статический класс ObjectPermission { ...

person Scott Hernandez    schedule 12.12.2011

Насколько я помню, вам нужно будет аннотировать класс @Embeddable и только ссылку как @Embedded. Но обычно вы делаете это со ссылками на отдельные объекты. Я не думаю, что вы можете встраивать целые коллекции. Вам лучше использовать @OneToMany для сопоставления Objectpermission. Это вызовет отдельную таблицу сопоставления.

person BitSchupser    schedule 12.12.2011
comment
Кажется, здесь предлагается code.google.com/p/morphia/wiki/EmbeddedAnnotation что вы можете сделать это (внизу страницы) - person pbattisson; 12.12.2011
comment
спасибо за ссылку, у меня есть (более старая) книга, которая предлагает @Embeddable я не знал, что @Embedded также работает на классах. - person BitSchupser; 12.12.2011