注解原始和級別類型的屬性
保存原始和基本類型的屬性到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"); } }