引用对象
Mongo在同一个数据库引用一个文档(对象)到另一个。考虑一下类:
public class BlogEntry {
private String title;
private Date publishDate;
private String body;
private Author author;
// getters and setters
}
...
public class Author {
private String username;
private String fullName;
private String emailAddress;
// getters and setters
}
这里的一个问题就是:我们如果注解BlogEntry中的author属性?当然,我们可以是用@Embedded注解,但是这样就没什么意义了,因为在没个BlogEntry实例中都保存一个Author
对象。我们反而想在多个blog实例中引用一个单独的Author文档(对象)在Mongo中。
在这种情况下我们使用 @Reference注解
import com.google.code.morphia.annotations.Entity;
import com.google.code.morphia.annotations.Embedded;
import com.google.code.morphia.annotations.Id;
import com.google.code.morphia.annotations.Reference;
import com.google.code.morphia.annotations.Property;
@Entity
public class BlogEntry {
@Id
private ObjectId id;
private String title;
private Date publishDate;
private String body;
@Reference
private Author author;
// getters and setters
}
...
@Entity
public class Author {
@Id
private ObjectId id;
private String username;
private String fullName;
private String emailAddress;
// getters and setters
}
当使用引用时有很重要的一点我们必须提及:被引用的对像在被引用之前必须已经保存到了MongoDB数据库中。
这个真的的意思是。就像上面的例子,在你创建一个BlogEntry对象之前,一个Author已经被保存到了数据库中。
默认情况下,Morphia使用属性名作为在数据库中保存的值。当然这个可以在@Reference注解中指定。
@Reference("blog_authors")
private List<Author> authors;
补充:注解使用的参数。
concreteClass: 指定具体的实体类。
ignoreMissing: 忽略任何不能解决的参考。
lazy: 为参考创建一个代理,这个将在第一次调用时加载(类似Hibernate中的lazy属性)
value: 指定在Mongo中存储的属性名。
原文连接:http://code.google.com/p/morphia/wiki/ReferenceAnnotation