morphia進階


注解原始和級別類型的屬性    

                 保存原始和基本類型的屬性到Mongo中,你不必為他們添加任何注解:            

...  
private int myInt;  
private Date myDate;  
private List<String> myStrings;  
private String[] stringArray;  

  默認情況下,Morphia將會試着映射所有支持的基本和原始類型到Mongo,包括這些類型的數組。

 

          MongoDB僅僅有一下數據類型:

 

  • Integer(32位有符號值)
  • Long(64有符號值)  
  • Double(64位IEEE745浮點值)
  • String (字符串)               

 

      這里有些有價值的轉換:

 

  • float → double
  • byte →  int
  • short →  int
  • char →  String        

 

    並且,依賴於你的模型中存在的類型和數據庫將會試着自動為你轉換。我的意思是,因為在MongoDB數據庫中只存在三種數字類型(32/64有符號, 64位FP)這將相當

  容易轉換。下面的列表為當前什么樣的基本和原始類型可以被保存:

 

  • enum(在Mongo中作為String保存)
  • java.util.Date(在Mongo中保存為從新紀元UTC的毫秒數)
  • java.util.Locale(作為字符串保存)
  • com.mongodb.DBRef
  • com.mongodb.ObjectId                   

 

   正如我我們上面的例子所示,Morphia還支持java.util.List, java.util.Set和java.util.Map容器, 和任何支持的原始類型的數組。

    如果你想把一個屬性排除映射到Mongo中, 你可以使用@Transient注解

import com.google.code.morphia.annotations.Transient;  
...  
@Transient private int myTransientInt; 

默認情況下,Morphia把屬性名作為Mongo中的字段名。這個可以通過@Property注解進行修改,指定一個名稱。

import com.google.code.morphia.annotations.Property;  
...  
@Property("my_integer")  
private int myInt;   //在MongoDB中為my_integer  

User Collections(使用容器)

Morphia 支持容器(List, Set, Map) 和數組(Integer)

  
private Set<String> tags;  
  
private Map<String,Translation> translations;  
  
@Reference  
private List<Article> relatedArticles;  

   Morphia 將使用一下實現(默認)來創建容器:

 

 

  • java.util.ArrayList for List
  • java.util.HashSet for Set
  • java.util.hashMap for Map                

 

        如果你想使用其他的實現, 你可以在注解中重寫他們

@Property(concreteClass = java.util.TreeSet.class)  
private Set<String> tags;  
  
@Embedded(concreteClass = java.util.TreeMap.class)  
private Map<String,Translation> translations;  
  
@Reference(concreteClass = java.util.Vector.class)  
private List<Article> relatedArticles;  

映射對象

 Create a Morphia instance(創建一個Morphia實例)
首先你要做的就是創建一個Morphia實例,並且告訴他你要映射的類。建議你僅創建一次Morphia實例,重復使用。映射的任何一個類都將會進行驗證,如果由於某些原因你映射的類不合法將會拋出一個MappingException異常

import com.google.code.morphia.Morphia;  
...  
Morphia morphia = new Morphia();  
morphia.map(BlogEntry.class)  
             .map(Author.class);  
...  

 指定Morphia去掃描一個包,映射包中的所有類。

morphia.mapPackage("my.package.with.only.mongo.entities");  

 Mapping a java for Persistence

         保存一個實例對象到Mongo數據庫中的一個容器中。調用Morphia中的toDBObject()方法,把java對象傳入。

         我們可以把返回的DBObject對象直接保存到Mongo中。

// map the blog entry to a Mongo DBObject  
DBObject blogEntryDbObj = morphia.toDBObject(blogEntry);  
  
// and then save that DBObject in a Mongo collection  
db.getCollection("BlogEntries").save(blogEntryDbObj);  

Retrieving a java from MongoDB(從Mongo中回復一個Java對象)

        從Mongo數據庫中的一個文檔創建一個Java對象。調用Morphia中的fromDBObject()方法即可,傳入要返回的DBObject對象。

// load the DBObject from a Mongo collection  
BasicDBObject blogEntryDbObj = (BasicDBObject) db.getCollection("BlogEntries")  
                          .findOne(new BasicDBObject("_id", new ObjectId(blogEntryId));  
  
// and then map it to our BlogEntry object  
BlogEntry blogEntry = morphia.fromDBObject(BlogEntry.class, blogEntryDbObj);  

使用Morphia管理Mongdo中的Java對象的非常清楚的方法是使用DAO 支持。DAO包含了操作Mongo和Morphia的抽象方法,所以業務邏輯不用依賴Morphia。

接口使用

          當我們從mongodb恢復一個對象時,如果它是一個接口,我們怎么知道它由哪個實現類實現的呢?
Morphia通過在Mongo的文檔中保存一個叫“className”的屬性,這個屬性值對應的是java對象的一個類全名。我們必須將接口的所有實現類全部映射到Morphia實例中。

Morphia morphia = new Morphia();  
    morphia.map(Circle.class)  
           .map(Rectangle.class)  
           .map(ShapeShifter.class);  

容器可以保存為一個嵌套集合:

ublic class ShapeContainer {  
    @Embedded  
    private List<Shape> shapes;  
    ...  
}  

或者保存為一個應用集合:

public class ShapeContainer {  
    @Reference  
    private List<Shape> shapes;  
    ...  
}  

使用DAO
       DAO封裝了存儲和調用的代碼,控制類只要注入一個DAO對象,使用它就不需要關心數據持久化和恢復了。
       Morphia基於DAO接口提供了BasicDAO實現類,它使用Datastore對象來存儲和查詢POJO對象,可以通過BasicDAO的方法來create/update, read, and delete 對象,可以參考它提供的例子和模式。
意味着你的DAO類只要繼承BasicDAO,只需要寫一個普通的查詢方法,就能查詢你自己的對象。

public class BlogEntryDAO extends BasicDAO<BlogEntry, ObjectId> {  
    public BlogEntryDAO( Morphia morphia, Mongo mongo ) {  
        super(mongo, morphia, "myBlogDb");  
    }  
}  

所有的方法都為我們實現了,我們只需做兩件重要的事:
     寫一個構造器,構造器將信息傳遞給DAO的父類;
     寫查詢方法。

BlogEntryDAO blogEntryDAO = new BlogEntryDAO(...);  
// get one specific blog entry  
ObjectId  blogEntryId = ...;  
BlogEntry myBlogEntry = blogEntryDAO.get(blogEntryId);  
// update it  
myBlogEntry.setTitle("My Blog Entry");  
blogEntryDAO.save(myBlogEntry);  
// or just delete it  
blogEntryDAO.deleteById(myBlogEntry.getId());  

控制類中的DAO可能由依賴注入框架注入,所以不需要關心細節。

自定義查詢方法:

public List<BlogEntry> findByTitle( String title ) {  
    Pattern regExp = Pattern.compile(title + ".*", Pattern.CASE_INSENSITIVE);  
    return ds.find(entityClazz).filter("title", regExp).sort("title").asList();  
}  

Validation  驗證
Morphia使用JSR303驗證注釋

在應用啟動或者創建Morphia對象的時候,調用

new ValidationExtension(morphia); 

 


免責聲明!

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



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