Morphia 是一个针对Mongo和Java 对象转换的映射的轻量级ORM类型安全类库。
1.简单易用,轻量级,一旦每一种类型通过反射获取将被缓存,性能比较好。
2.Datastore和DAO<T,V>的抽象封装。
3.快速的查询的支持,在类运行时进行校验。
4.Mapping是基于注解而不是基于xml。
5.针对Validation和Log的扩展。
6.生命周期的控制。
7.可以和Spring,Guice等DI框架整合。
8.支持各种功能的扩展。
@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();
@Id
@Id将值注解为MongoDB的唯一ID字段,MongoDB必须有一个唯一索引,mongo会自动生成id。如果使用其他类型,需要自己设置。
@Id private ObjectId id;
@Indexed
当datastore.ensureIndexes() 方法调用时,mongoDB将该值生成索引。
@Indexed(value=IndexDirection.ASC, name="upc", unique=true, dropDups=true) private String upcSymbol;value :指定index的方向。默认ASC。 IndexDirection.ASC (ascending), IndexDirection.DESC (descending), IndexDirection.BOTH (both)
@Indexes&@Index
复合indexes可以指定多个字段,该注解是class级别。例如下面代码指定user为默认升序同时date为降序(-表示DESC)
@Entity // this is require to know where the indexes are to be created
@Indexes( @Index("user, -date") )
public class ChangeLog{
Date date;
String user;
Record changedRecord;
}
如下表示可以找到最近变化的记录,该集合拥有两个复合indexes
@Transient 不将该字段保存到mongoDB@Property("feild_name") 指定该对象的属性映射到mongoDB的字段名称,默认为该对象的属性名。
@Serialized 字段被转换成二进制,并且被存储
@NotSaved 字段不会被保存,但是能被加载,良好的数据迁移
@AlsoLoad 该字段所以提供的名字都能被加载,良好的数据迁移
@Version 为Entity提供一个乐观锁,动态加载,不需要设置值
@Entity class Myclass { ... @Version Long v; }
@Entity public class Hotel { @Id private String id; private String name; private int stars; @Embedded private Address address; // ... getters and setters } ... import com.google.code.morphia.annotations.Embedded; @Embedded public class Address { private String street; private String city; private String postCode; private String country; // ... getters and setters }
@EntityListeners(BackAccountWatcher.class) class BankAccount { @Id String id; Date lastUpdated = new Date(); } class BankAccountWatcher{ @PrePersist void PrePersist() {} @PrePersist void PrePersistWithParam(BankAccount act) {act.lastUpdated = new Date();} @PrePersist DBObject PrePersistWithParamAndReturn(DBObject dbObj) {} @PostPersist void postPersist() {} @PostPersist void postPersistWithParam(DBObject dbObj) {} @PreLoad void preLoad() {} @PreLoad void PreLoadWithParam(DBObject dbObj) {} @PreLoad DBObject PreLoadWithParamAndReturn(DBObject dbObj) {} @PostLoad void PostLoad() {} @PreLoad void PostLoadWithParam(DBObject dbObj)