设为首页 收藏本站
查看: 1352|回复: 0

[经验分享] Mongo的ORM框架的学习Morphia(十一) morphia自定义注解、转换器的使用

[复制链接]

尚未签到

发表于 2016-12-2 10:03:14 | 显示全部楼层 |阅读模式
  转自:http://topmanopensource.iyunv.com/blog/1439689

  http://topmanopensource.iyunv.com/blog/1439692

  一:自定义注解的使用



      在特殊的情况下,定义服务端注解,减少配置。下面代码为注解的使用:
注解类:

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
*/
@Entity
public class MorphiaInfo {
private @Id String id;
//自定义注释的使用
@Lowercase
private 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();
}
}
}

   二:自定义转换器的使用


         在Morphia中为什么各种数据库可以自由转换为Java对象呢?主要采用转换器机制实现实现字符串和Java对象之间的转换,转换器类需要实现TypeConvertor,如下:


public  class FooConverter extends TypeConverter implements SimpleValueConverter
  下面讲解转换器的使用:


package com.easyway.mongodb.morphia.converter;
import com.google.code.morphia.annotations.Entity;
import com.google.code.morphia.annotations.Id;
/**
*
* @Title: TODO
* @Description: 实现TODO
* @Copyright:Copyright (c) 2011
* @Company:易程科技股份有限公司
* @Date:2012-3-4
* @author
* @version 1.0
*/
@Entity(noClassnameStored=false,value="animail")
public class Animail {
@Id
private String id;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}

}

 
package com.easyway.mongodb.morphia.converter;
import java.util.HashMap;
import java.util.Map;
import com.google.code.morphia.annotations.Embedded;
import com.google.code.morphia.annotations.Entity;
/**
*
* @Title: TODO
* @Description: 实现TODO
* @Copyright:Copyright (c) 2011
* @Company:易程科技股份有限公司
* @Date:2012-3-4
* @author
* @version 1.0
*/
@Entity(noClassnameStored=false,value="animail")
public class Dog extends Animail{
private static final long serialVersionUID = 1L;
@Embedded
Map<String, Foo> foo = new HashMap<String, Foo>();
}

 
package com.easyway.mongodb.morphia.converter;
import net.sf.json.JSONObject;
/**
*
* @Title: TODO
* @Description: 实现TODO
* @Copyright:Copyright (c) 2011
* @Company:易程科技股份有限公司
* @Date:2012-3-4
* @author
* @version 1.0
*/
public  class Foo {
private String name;
private String email;
Foo(){}
public Foo(String name,String email) {
this.name = name;
this.email=email;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return JSONObject.fromObject(this).toString();
}
}
  转换器类如下:


package com.easyway.mongodb.morphia.converter;
import net.sf.json.JSONObject;
import com.google.code.morphia.converters.SimpleValueConverter;
import com.google.code.morphia.converters.TypeConverter;
import com.google.code.morphia.mapping.MappedField;
import com.google.code.morphia.mapping.MappingException;
/**
*
* @Title: TODO
* @Description: 实现TODO
* @Copyright:Copyright (c) 2011
* @Company:易程科技股份有限公司
* @Date:2012-3-4
* @author
* @version 1.0
*/
public  class FooConverter extends TypeConverter implements SimpleValueConverter  {
public boolean done;
public FooConverter() {
super(Foo.class);
}
/**
*
*/
@Override
public Object decode(Class targetClass, Object fromDBObject, MappedField mf)
throws MappingException {
if(fromDBObject==null){
return null;
}
JSONObject jsonObject=JSONObject.fromObject(fromDBObject);
return JSONObject.toBean(jsonObject, targetClass);
}
@Override
public Object encode(Object value, MappedField optionalExtraInfo) {
done = true;
return JSONObject.fromObject(value).toString();
}
public boolean didConversion() {
return done;
}
}
 
package com.easyway.mongodb.morphia.converter;
import java.util.LinkedList;
import java.util.List;
import com.google.code.morphia.annotations.Embedded;
import com.google.code.morphia.annotations.Entity;
/**
*
* @Title: TODO
* @Description: 实现TODO
* @Copyright:Copyright (c) 2011
* @Company:易程科技股份有限公司
* @Date:2012-3-4
* @author
* @version 1.0
*/
@Entity(noClassnameStored=false,value="animail")
public class Pig  extends Animail{
private static final long serialVersionUID = 1L;
@Embedded
List<Foo> foo = new LinkedList<Foo>();
}

  测试如下:


package com.easyway.mongodb.morphia.converter;
import java.net.UnknownHostException;
import com.google.code.morphia.AdvancedDatastore;
import com.google.code.morphia.Datastore;
import com.google.code.morphia.Morphia;
import com.mongodb.DB;
import com.mongodb.Mongo;
import com.mongodb.MongoException;
/**
*
* @Title: TODO
* @Description: 实现TODO
* @Copyright:Copyright (c) 2011
* @Company:易程科技股份有限公司
* @Date:2012-3-4
* @author
* @version 1.0
*/
public class FooConverterApp {

public static void main(String[] args) throws UnknownHostException, MongoException {
Morphia morphia = new Morphia();
Mongo mongo = new Mongo("localhost");
DB db= mongo.getDB("morphia_test");
Datastore ds = morphia.createDatastore(mongo, db.getName());
AdvancedDatastore ads = (AdvancedDatastore) ds;
morphia.map(Pig.class).map(Dog.class).map(Animail.class);
FooConverter  fc=new FooConverter();
//morphia.getMapper().getConverters().addConverter(fc);
Dog e = new Dog();
e.foo.put("bar",new Foo("bar"," a bar"));
e.foo.put("big",new Foo("dog","a dog"));
ds.save(e);
System.out.println(e.foo.get("bar").toString());
Pig pig=new Pig();
pig.foo.add(new Foo("a","b"));
pig.foo.add(new Foo("b","c"));
ds.save(pig);
}
}

 

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-308573-1-1.html 上篇帖子: Win7 32下运行MongoDB出错:couldn't connect to server 127.0.0.1 shell/mongo.js:84 下篇帖子: 【MongoDB学习笔记十二】Mongo副本集服务器角色之Arbiter
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表