Mongo的ORM框架的学习Morphia(十二) morphia自定义转换器的使用
??? 在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 {@Idprivate 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;@EmbeddedMap<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;}@Overridepublic 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);}/** * */@Overridepublic 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);}@Overridepublic 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;@EmbeddedList<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);} }?