Morphia 學習一 注解


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將不能正確的識別創建那個類。如:

 

[java]  view plain copy
  1. @Entity("animals") abstract class Animal { String name; }   
  2. @Entity("animals") Cat extends Animal { ... }   
  3. @Entity("animals") Dog extends Animal { ... }   
  4.   
  5. //And then performing the following query...  
  6. List<Animal> animals = ds.createQuery(Animal.class).asList();   


@Id
        @Id將值注解為MongoDB的唯一ID字段,MongoDB必須有一個唯一索引,mongo會自動生成id。如果使用其他類型,需要自己設置。

[java]  view plain copy
  1. @Id  
  2.     private ObjectId id;  


@Indexed
    當datastore.ensureIndexes() 方法調用時,mongoDB將該值生成索引。

[java]  view plain copy
  1. @Indexed(value=IndexDirection.ASC, name="upc", unique=true, dropDups=true)   
  2.     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)

[java]  view plain copy
  1. <span style="font-size:10px;">@Entity // this is require to know where the indexes are to be created  
  2. @Indexes( @Index("user, -date") )  
  3. public class ChangeLog{  
  4.  Date date;  
  5.  String user;  
  6.  Record changedRecord;  
  7. } </span>  



如下表示可以找到最近變化的記錄,該集合擁有兩個復合indexes
@Transient 不將該字段保存到mongoDB@Property("feild_name") 指定該對象的屬性映射到mongoDB的字段名稱,默認為該對象的屬性名。
@Serialized 字段被轉換成二進制,並且被存儲
@NotSaved 字段不會被保存,但是能被加載,良好的數據遷移
@AlsoLoad 該字段所以提供的名字都能被加載,良好的數據遷移
@Version 為Entity提供一個樂觀鎖,動態加載,不需要設置值

[java]  view plain copy
  1. @Entity  
  2. class Myclass {  
  3.    ...  
  4.    @Version Long v;  
  5. }  




@Embedded 創建一個類被嵌套在實體類中的情況下使用,例如,在Hotel類中 可能會有一個Address。Address是Hotel不可分割的一部分,沒有ID, 並且不會被存儲在分開的collection中。事實上被@Embedded注釋的類不允許有@Id

[java]  view plain copy
  1. @Entity  
  2. public class Hotel {  
  3.   
  4.     @Id  
  5.     private String id;  
  6.   
  7.     private String name;  
  8.     private int stars;  
  9.   
  10.     @Embedded  
  11.     private Address address;  
  12.   
  13.     // ... getters and setters  
  14. }  
  15.   
  16. ...  
  17.   
  18. import com.google.code.morphia.annotations.Embedded;  
  19.   
  20. @Embedded  
  21. public class Address {  
  22.   
  23.     private String street;  
  24.     private String city;  
  25.     private String postCode;  
  26.     private String country;  
  27.   
  28.     // ... getters and setters  
  29. }  




@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 指定外部生命周期事件實現類

[java]  view plain copy
    1. @EntityListeners(BackAccountWatcher.class)  
    2. class BankAccount {  
    3.   @Id String id;  
    4.   Date lastUpdated = new Date();  
    5. }  
    6.   
    7. class BankAccountWatcher{  
    8.     @PrePersist  
    9.     void PrePersist() {}                  
    10.     @PrePersist  
    11.     void PrePersistWithParam(BankAccount act) {act.lastUpdated = new Date();}  
    12.     @PrePersist  
    13.     DBObject PrePersistWithParamAndReturn(DBObject dbObj) {}  
    14.       
    15.     @PostPersist  
    16.     void postPersist() {}                  
    17.     @PostPersist  
    18.     void postPersistWithParam(DBObject dbObj) {}  
    19.       
    20.     @PreLoad  
    21.     void preLoad() {}                  
    22.     @PreLoad  
    23.     void PreLoadWithParam(DBObject dbObj) {}                
    24.     @PreLoad  
    25.     DBObject PreLoadWithParamAndReturn(DBObject dbObj) {}  
    26.       
    27.     @PostLoad  
    28.     void PostLoad() {}                  
    29.     @PreLoad  
    30.     void PostLoadWithParam(DBObject dbObj)  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM