Mongo的ORM框架的学习Morphia(十一) morphia自定义注解的使用
???? 在特殊的情况下,定义服务端注解,减少配置。下面代码为注解的使用:
注解类:
package com.easyway.mongodb.morphia.annotation;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/** * * @Title: 自定义注释的使用 * @Description: 实现TODO * @Copyright:Copyright (c) 2011 * @Company:易程科技股份有限公司 * @Date:2012-3-2 * @author * @version 1.0 */@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.FIELD})public @interface Lowercase {}?
?
package com.easyway.mongodb.morphia.annotation;import com.google.code.morphia.annotations.Entity;import com.google.code.morphia.annotations.Id;/** * 用于存储MorphiaInfo的信息 * @Title: * @Description: 实现TODO * @Copyright:Copyright (c) 2011 * @Company:易程科技股份有限公司 * @Date:2012-3-2 * @author * @version 1.0 */@Entitypublic class MorphiaInfo {private @Id String id;//自定义注释的使用@Lowercaseprivate String morphiaName;private String version;public String getId() {return id;}public void setId(String id) {this.id = id;}public String getMorphiaName() {return morphiaName;}public void setMorphiaName(String morphiaName) {this.morphiaName = morphiaName;}public String getVersion() {return version;}public void setVersion(String version) {this.version = version;}}?
?
package com.easyway.mongodb.morphia.annotation;import java.util.List;import com.google.code.morphia.EntityInterceptor;import com.google.code.morphia.mapping.MappedClass;import com.google.code.morphia.mapping.MappedField;import com.google.code.morphia.mapping.Mapper;import com.mongodb.DBObject;/** * 使用拦截器机制的使用用于特定的处理 * * @Title: * @Description: 实现自定义注释的使用 * @Copyright:Copyright (c) 2011 * @Company:易程科技股份有限公司 * @Date:2012-3-2 * @author * @version 1.0 */public class ToLowercaseHelper implements EntityInterceptor {public void postLoad(Object ent, DBObject dbObj, Mapper mapr) {}public void postPersist(Object ent, DBObject dbObj, Mapper mapr) {}/** * 保存的前的拦截 */public void preSave(Object ent, DBObject dbObj, Mapper mapr) {}/** * 加载前的操作 */public void preLoad(Object ent, DBObject dbObj, Mapper mapr) {}/** * 持久化前的处理 * (non-Javadoc) * @see com.google.code.morphia.EntityInterceptor#prePersist(java.lang.Object, com.mongodb.DBObject, com.google.code.morphia.mapping.Mapper) */public void prePersist(Object ent, DBObject dbObj, Mapper mapr) {//获取映射的类MappedClass mc = mapr.getMappedClass(ent);//获取映射的特定注释的类字段List<MappedField> toLowercase = mc.getFieldsAnnotatedWith(Lowercase.class);//针对映射特定的注释类的处理for (MappedField mf : toLowercase) {try {Object fieldValue = mf.getFieldValue(ent);dbObj.put(mf.getNameToStore() + "_lowercase", fieldValue.toString().toLowerCase());} catch (Exception e) {throw new RuntimeException(e);}}}}?
?
package com.easyway.mongodb.morphia.annotation;import com.google.code.morphia.AdvancedDatastore;import com.google.code.morphia.Datastore;import com.google.code.morphia.Morphia;import com.google.code.morphia.mapping.MappedField;import com.mongodb.DB;import com.mongodb.Mongo;/** * * @Title: 简单的测试类 * @Description: 实现TODO * @Copyright:Copyright (c) 2011 * @Company:易程科技股份有限公司 * @Date:2012-3-2 * @author * @version 1.0 */public class AnnotationApp {public static void main(String[] args) {try { String dbName="test"; //创建一个Mongo对象 Mongo mongo = new Mongo("localhost"); //获取Mongo的数据库对象 DB db = mongo.getDB(dbName); //创建一个Morphia对象 Morphia morphia = new Morphia(); //创建一个Datastore对象用于操作数据 Datastore ds= morphia.createDatastore(mongo, db.getName()); AdvancedDatastore ads = (AdvancedDatastore) ds; //映射字段添加对应的自定义注释的注册 MappedField.interestingAnnotations.add(Lowercase.class); //映射mapper中添加相关的拦截器 morphia.getMapper().addInterceptor(new ToLowercaseHelper()); //设置映射的类 morphia.map(MorphiaInfo.class); //保存一个mongo对象 MorphiaInfo u = new MorphiaInfo(); u.setVersion("Morphia V1.0"); u.setMorphiaName("MorphiaName"); ds.save(u); //查找一个mongo对象MorphiaInfo uScott = ds.find(MorphiaInfo.class).disableValidation().filter("morphiaName_lowercase", u.getMorphiaName().toLowerCase()).get(); System.out.println("uScott="+uScott.getMorphiaName()); } catch (Exception e) {e.printStackTrace();}}}?