我有一个这样的递归数据结构:
@Entity
class Node {
@Id
private Long id;
@Reference
private List<Node> children;
...
@PrePersist
void populateSequentialId() {
// query data store for highest id and increment, then set the id field
}
}
然后我填充一个Node对象树,所有这些都没有设置id。深度变化,但通常深度约为3级。
当我在没有孩子的对象上调用save()
时,它可以工作。生成并设置id,并保存对象。这意味着@PrePerist按预期在该实体上被调用。
但是对于引用列表中的实体,从不调用@PrePersist,并且save
调用由于空@Id
字段而失败。
这是Morphia中的错误还是我的错误预期?
答案 0 :(得分:0)
您需要自己保留每个文档。
所以如果A引用B:
_id
作为参考否则操作将失败。
答案 1 :(得分:0)
类的生命周期注释仅在持久保存该类型的对象时使用。在字段上有@Reference
注释时,这些引用的对象仅用于在引用文档中存储键值。引用的对象不会以任何方式保留或处理。您需要手动保存引用的对象,然后才会应用@PrePersist
。