Morphia 是一個針對Mongo和Java 對象轉換的映射的輕量級ORM類型安全類庫。
1.簡單易用,輕量級,一旦每一種類型通過反射獲取將被緩存,性能比較好。
2.Datastore和DAO<T,V>的抽象封裝。
3.快速的查詢的支持,在類運行時進行校驗。
4.Mapping是基於注解而不是基於xml。
5.針對Validation和Log的擴展。
6.生命周期的控制。
7.可以和Spring,Guice等DI框架整合。
8.支持各種功能的擴展。
Entity注解
@Entity
value屬性為DBConllection設置名稱。必須有一個無參的默認構造方法,可以是public、protected、private等
noClassnameStored屬性默認為存儲類名。如果只存儲單一的實體對象並且關心數據庫大小,不存儲類名是安全的。
保存類名的主要目的是在同一個鏈接中保存不同的實體對象,但是你想作為他們的基類或超類來讀取。如果不在文檔中保存類名,Morphia將不能正確的識別創建那個類。如:
- @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)
name :指定index的名稱。默認由mongoDB產生
unique:是否為唯一索引。默認false。如果為true,插入重復值會報錯。
dropDups:通知唯一索引刪除重復值,只有第一條被保留,默認為false。
@Indexes&@Index
復合indexes可以指定多個字段,該注解是class級別。例如下面代碼指定user為默認升序同時date為降序(-表示DESC)
- <span style="font-size:10px;">@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;
- } </span>
如下表示可以找到最近變化的記錄,該集合擁有兩個復合indexes
@Transient 不將該字段保存到mongoDB@Property("feild_name") 指定該對象的屬性映射到mongoDB的字段名稱,默認為該對象的屬性名。
@Serialized 字段被轉換成二進制,並且被存儲
@NotSaved 字段不會被保存,但是能被加載,良好的數據遷移
@AlsoLoad 該字段所以提供的名字都能被加載,良好的數據遷移
@Version 為Entity提供一個樂觀鎖,動態加載,不需要設置值
- @Entity
- class Myclass {
- ...
- @Version Long v;
- }
@Embedded 創建一個類被嵌套在實體類中的情況下使用,例如,在Hotel類中 可能會有一個Address。Address是Hotel不可分割的一部分,沒有ID, 並且不會被存儲在分開的collection中。事實上被@Embedded注釋的類不允許有@Id
- @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
- }
@Reference 在數據庫中引用另外一個文檔,可以在多個Entity中引用同一個文檔,注意被引用對象在被引用之前必須已經保存到mongoDB中。
concreteClass: 指定具體的實體類。
ignoreMissing: 忽略任何不能解決的參考。
lazy:為參考創建一個代理,這個將在第一次調用時加載(類似Hibernate中的lazy屬性)
value: 指定在Mongo中存儲的屬性名。默認使用對象的屬性名保存到mongo中
生命周期方法注解(delete沒有生命周期事件)
@PrePersist save之前被調用,它可以返回一個DBObject代替一個空的
@PostPersist save到datastore之后被調用
@PreLoad 在Entity被映射到datastore對象之前被調用,可以對參數DBObject進行add/remove/change
@PostLoad 在Entity被映射之后被調用
@EntityListeners 指定外部生命周期事件實現類
- @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)