mongoDB的介绍和相关操作(7)
Morphia-Mongodb的orm
Morphia,一个轻量级的类型安全的 Java 类库,用来将在 MongoDB 和 Java 对象之间进行映射.?类似hibernate。如果使用过hinernate再使用它会上手很快
POJO
@Entity(value = "test", noClassnameStored=true)
//默认是要持久所有对象的
public?class?Meeting {
????@Id
????private?ObjectId id;
????// 标题
????// @Transient //这个表示不持久
????private?String title;
????public?String getTitle() {
????????return?title;
????}
????public?void?setTitle(String title) {
????????this.title = title;
????}
??????public?ObjectId getId() {
????????return?id;
????}
????public?void?setId(ObjectId id) {
????????this.id = id;
????}
}???? ?
@Entity实体类,name为collection的名称,noClassnameStored用来标识是否需要存储className字段来表示类名,为什么要使用他哪?保存类名的主要目的是,当你在同一个链接中保存不同的实体对象,但是你想
?作为他们的基类或超类来读取。
?如:
? ?@Entity("animals") abstract class Animal { String name; }?
@Entity("animals") Cat extends Animal { ... }?
@Entity("animals") Dog extends Animal { ... }?
//And then performing the following query...
List<Animal> animals = ds.createQuery(Animal.class).asList();?
?正如你看到的,如果不在文档中保存类名,Morphia将不能正确的识别创建那个类。
?如果你在一个链接中只保存唯一的实体类型并且你还关心你的数据库大小,在你的@Entity注解上加上noClassnameStored=true
?参数将会是安全的。
?
@Id
被@Entity注解的类必须有一个唯一的 @Id值;这些值被保存在 MongoDB数据库的“id”属性中,这是一个必须的为索引。被@Id注解的ID是ObjectId类型的,这样,你就不用担心Id的生成问题了,Mongo会自动为你生成一
? 个唯一的新的ObjectId对象(就行MySQL中的auto_increment类型的ID)。如果你想使用其他的类型作为ID,那么在你保存数据时就必须
? 手动为ID赋值。
?
?@Indexed
此注解是为某个字段申请一个索引。 当datastore.ensureIndexes() 方法被调用时 这些索引就会被申请
?参数说明如下:
???value:?表名这个索引的方向; IndexDirection.ASC(升序),IndexDirection.DESC(降序), IndexDirection.BOTH(两者)
?? ? ? ? ? ? 默认为 升序;
???name:?被创建的索引的 名称; mongodb默认创建的索引名的格式为(key1_1/-1_key2_1)
???unique:?创建一个唯一索引,当创建唯一索引后,当在此字段插入相同的值时将会报错。true:为唯一索引;false:不是唯一索引。
?? ? ? ? ? ? ? ? 默认为:false
???dropDups:此参数表明,当为某个字段创建唯一索引时,删除其他相同值的记录。只保留第一条记录。true:删除重复,
?? ? ? ? ? ? ? ? ? ? ?false:不删除重复(当有重复值时唯一索引创建失败);默认为false.
注意:当在一个存在的系统上,创建已经存在的索引时,将不会花费任何事件(也不会做任何事情)。
?? ? ? ?Morphia m = .....
?? ? ? ?Datastore ds = ....
?? ? ?m.map(Product.class);
?? ? ?ds.ensureIndexes(); ?//为被@Indexed注解的所有字段创建索引。
?
@Embedded
你可以创建一个类被嵌套在实体类中,在这种情况下我们可以使用@Embedded注解。例如,在Hotel类中 可能会有一个Address。
?? ? Address是Hotel不可分割的一部分,没有ID, 并且不会被存储在分开的collection中。在这种情况下我们可以使用@Embedded注解
?? Address.
?? ? ?@Entity
?? ? ?public class Hotel{
?? ? ? ?...
?? ? ? ?@Id
?? ? ? private ObjectId id;
?? ? ? @Embedded(“address”)
?? ? ? private Address address;
?? ? ? ...
?? ? ?}?
?? ? ?@Embedded
?? ?public ?class Address{
?? ? ? ?...
?? ? }
正如你所看到的,被@Embedded注解的类没有@Id。 这是因为他们经常被嵌套在其他类中。事实上,被@Embedded注解的类也不允许有@Id?
@Reference
和@Embedded类似,但是被存储在分开的collection中
@Entity
public class BlogEntry {
? ? @Id
? ? private ObjectId id;
? ? private String title;
? ? private Date publishDate;
? ? private String body;
? ? @Reference(“blog _author”)
? ? private Author author;
? ? // getters and setters
}
...
@Entity(“author”)
public class Author {
? ? @Id
? ? private ObjectId id;
? ? private String username;
? ? private String fullName;
? ? private String emailAddress;
? ? // getters and setters
}
?
@Property
指定对应数据的名称如@Property("started")
?
@AlsoLoad
Load的时候可以从一个或多个域里取值,但要保证这多个域在同一个document里只出现一次 如 字段定义了? title字段 并注解了 @AlsoLoad({"xxx",”xxx1”}),则可以从数据库的title、xxx、xxx1里取值,但同一个document里只能存在 title、xxx、xxx1里的一个
?
@NotSaved
只会被load不会被save
?
@PrePersist?– 在保存之前调用
@PostPersist?– 保存之后调用
@PreLoad?– 在映射成POJO前调用
@PostLoad?– 在映射成POJO后调用
?
?
DAO
只需要简单的继承一下Morphia提供的DAO,就能很快地实现对领域类的CRUD。
public class EntryDAO extends DAO<Entry, Serializable> {? ??? public EntryDAO(Morphia morphia, Mongo mongo) {? ??????? super(mongo, morphia, "entries");? ??? }? }?