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。
Morphia morphia = new Morphia(); morphia.map(Circle.class) .map(Rectangle.class) .map(ShapeShifter.class);
public class ShapeContainer { @Embedded private List<Shape> shapes; ... }
public class ShapeContainer { @Reference private List<Shape> shapes; ... }
public class BlogEntryDAO extends BasicDAO<BlogEntry, ObjectId> { public BlogEntryDAO( Morphia morphia, Mongo mongo ) { super(mongo, morphia, "myBlogDb"); } }
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(); }