Morphia - Ошибка сериализации при обновлении объекта со списком ссылок

У меня есть дерево вложенных объектов, которые я сохраняю в Mongo с помощью Morphia. Чтобы сохранить дерево, сначала я сохраняю родительский объект, затем сохраняю дочерние объекты и обновляю родительский объект списком ссылок на дочерние объекты. Я получаю сообщение «ОШИБКА: невозможно сериализовать класс ClusteringNode» при выполнении обновления, даже если сохранение отдельных объектов выполнено успешно. Я попытался добавить интерфейс Serializable, и это не помогло. Вот код:

@Entity
public class ClusteringNode {
    @Id
    private ObjectId id;
    @Reference
    private ClusteringNode parent;

    @Reference
    private List<ClusteringNode> children;

}

saveMethod() {
  ClusteringNode node = new ClusteringNode();
    node.setName("parent");
    getDatastore().save(node);

    List<ClusteringNode> children = new ArrayList<>();
   ClusteringNode c1 = new ClusteringNode();
    c1.setName("c1");
    c1.setParent(node);
    getDatastore().save(c1);
    children.add(c1);
    ClusteringNode c2 = new ClusteringNode();
    c2.setName("c2");
    c2.setParent(node);
    getDatastore().save(c2);
    children.add(c2);
    Query<ClusteringNode> updateQuery = getDatastore().createQuery(ClusteringNode.class).field("_id").equal(node.getId());
 //  Tried both set() and addAll(), get the same result  
 //  UpdateOperations<ClusteringNode> ops = getDatastore().createUpdateOperations(ClusteringNode.class).addAll("children", children,false);
     UpdateOperations<ClusteringNode> ops = getDatastore().createUpdateOperations(ClusteringNode.class).set("children", children);
   getDatastore().update(updateQuery, ops);     
}   

Вот трассировка стека:

java.lang.IllegalArgumentException: can't serialize class edu.harvard.iq.text.model.ClusteringNode
at org.bson.BasicBSONEncoder._putObjectField(BasicBSONEncoder.java:273)
at org.bson.BasicBSONEncoder.putIterable(BasicBSONEncoder.java:298)
at org.bson.BasicBSONEncoder._putObjectField(BasicBSONEncoder.java:237)
at org.bson.BasicBSONEncoder.putMap(BasicBSONEncoder.java:313)
at org.bson.BasicBSONEncoder._putObjectField(BasicBSONEncoder.java:235)
at org.bson.BasicBSONEncoder.putObject(BasicBSONEncoder.java:174)
at org.bson.BasicBSONEncoder.putObject(BasicBSONEncoder.java:120)
at com.mongodb.DefaultDBEncoder.writeObject(DefaultDBEncoder.java:27)
at com.mongodb.OutMessage.putObject(OutMessage.java:289)
at com.mongodb.OutMessage.writeUpdate(OutMessage.java:175)
at com.mongodb.OutMessage.update(OutMessage.java:62)
at com.mongodb.DBApiLayer$MyCollection.update(DBApiLayer.java:325)
at com.mongodb.DBCollection.update(DBCollection.java:178)
at org.mongodb.morphia.DatastoreImpl.update(DatastoreImpl.java:1142)
at org.mongodb.morphia.DatastoreImpl.update(DatastoreImpl.java:1100)
at org.mongodb.morphia.DatastoreImpl.update(DatastoreImpl.java:1106)
at org.mongodb.morphia.DatastoreImpl.update(DatastoreImpl.java:999)
at edu.harvard.iq.text.model.NodeHierarchyTest.verySimpleTest(NodeHierarchyTest.java:116)

Если вместо addAll() я добавляю каждый объект по отдельности, это работает:

 UpdateOperations<ClusteringNode> ops = getDatastore().createUpdateOperations(ClusteringNode.class).add("children", children.get(0));
    getDatastore().update(updateQuery, ops);
    ops = getDatastore().createUpdateOperations(ClusteringNode.class).add("children", children.get(1));
    getDatastore().update(updateQuery, ops);

person Ellen    schedule 07.11.2013    source источник
comment
Как выглядит фактическая трассировка стека?   -  person evanchooly    schedule 07.11.2013
comment
Вот трассировка стека (добавлено к моему вопросу)   -  person Ellen    schedule 07.11.2013


Ответы (1)


OK. Это похоже на ошибку, которую я только что исправил. Можете ли вы попробовать еще раз с 0.106-SNAPSHOT и посмотреть, будут ли по-прежнему возникать ошибки?

person evanchooly    schedule 07.11.2013
comment
Хорошо, я попробую это. Я смотрю на проект github и не могу найти ссылку на снимок. Есть ли репозиторий, который мне нужно добавить в мой pom.xml, чтобы я мог использовать его в качестве зависимости? - person Ellen; 08.11.2013
comment
Да, это работало с версией 0.106-SNAPSHOT. Чтобы включить его, я добавил этот репозиторий в свой pom.xml: ‹репозиторий› ‹id›snapshots-repo‹/id› ‹url›oss.sonatype.org/content/repositories/snapshots‹/url› ‹releases›‹enabled›false‹/enabled›‹/releases› ‹snapshots›‹enabled› true‹/enabled›‹/snapshots› ‹/repository› Спасибо! - person Ellen; 08.11.2013
comment
Здорово. Приятно слышать. я скоро увижу, как вырезать реальную версию 0.106 с этим исправлением и другими. - person evanchooly; 08.11.2013
comment
Это все еще не работает для меня. Я использовал такой запрос: class Org { @Reference private Plan plan; } createQuery().field(plan).hasAnyOf(plans); и он ничего не возвращает, тогда как до того, как этот тест прошел успешно. Я проверил БД, и DBRef указывает на правильный ObjectId. - person Patricio; 17.01.2014
comment
Полный ответ здесь: groups.google.com/d/msg/morphia /eieRfdv4ZXM/cQbVbH92t-4J - person evanchooly; 17.01.2014