Morphia is a lightweight type-safe library for mapping Java objects to/from MongoDB
:
Morphia是一个安全轻量级的为
MongoDB设计的java持久化架构。
1.要使用Morphia,需要依赖下面JARs:
MongoDB java driver
Morphia Release (根据driver版本选择不同版本)
Optional (but needed if you use Maven)
CGLib
ProxyToys
如果项目中用到maven,需要在pom.xml中加入
com.google.code.morphia
morphia
###
cglib
cglib-nodep
[2.1_3,)
jar
true
com.thoughtworks.proxytoys
proxytoys
1.0
jar
true
2.基于spring test 的morphia 基本操作
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:spring-beans-test.xml"})
public class MorphiaDaoTest {
@Resource
ResourceMethodDao resourceMethodDao;
@Resource
ParameterDefinitionDao parameterDefinitionDao;
@Before
public void checkNull(){
Assert.notNull(resourceMethodDao);
}
public void addObject(){
ResourceMethod method = new ResourceMethod();
method.setName("产品获取");
method.setJsBody("javascript:void(0)");
method.setCreator("liu");
method.setId(4);
method.setCreatedTime(new Date());
List list = getResouceDefinition();
method.setParameters(list);
Key id = resourceMethodDao.save(method);
Assert.notNull(id);
}
public void query(){
Query query = resourceMethodDao.createQuery();
//query.field("creator").equal("liu");
ParameterDefinition object = new ParameterDefinition();
object.setId(1);
query.field("parameters").hasThisElement(object);
// Query query = resourceMethodDao.createQuery().filter("id >", 0).order("-id");//查询id大于0的,
//并按id降序排列
List list = resourceMethodDao.find(query).asList();
System.out.println(list);
}
public void delete(){
//ResourceMethod res = new ResourceMethod();
Query query = resourceMethodDao.createQuery();
query.field("creator").equal("liu");
resourceMethodDao.deleteByQuery(query);
//resourceMethodDao.deleteById(id)
//resourceMethodDao.delete(res);//实体中至少要含有id
}
@Test
public void update(){
Query query = resourceMethodDao.createQuery();
query.field("creator").equal("alan");
UpdateOperations ops = resourceMethodDao.createUpdateOperations()
.set("creator", "long").inc("ResourceType", 12);
resourceMethodDao.update(query,ops);
//resourceMethodDao.updateFirst(query, ops);
}
private List
getResouceDefinition() {
List list = new ArrayList();
ParameterDefinition para = new ParameterDefinition();
para.setId(1);
para.setName("name");
para.setType(FieldType.STRING);
parameterDefinitionDao.save(para);
list.add(para);
ParameterDefinition para1 = new ParameterDefinition();
para1.setId(2);
para1.setName("value");
para1.setType(FieldType.STRING);
parameterDefinitionDao.save(para1);//这里是@Reference方式引用,所以插入前必须保证字表中存在引用数据
list.add(para1);
return list;
}
DAO集成BasicDAO
public class ResourceMethodDao extends BasicDAO {
protected ResourceMethodDao(Datastore ds) {
super(ds);
}
}
实体
@Entity
public class ResourceMethod implements Serializable {
private static final long serialVersionUID = -2260371987627421226L;
@Id
int id;
/** 方法名称 */
String name;
/** 资源类型 */
int ResourceType;
/** 返回数据结构类型 */
DataStructure returnStructure;
/** 是否系统方法 */
boolean system;
/** js实现的方法提, system=false时有效*/
String jsBody;
/** 创建日期 */
Date createdTime;
/** 创建人 */
String creator;
/** 更新日期 */
Date updatedTime;
/** 更新人 */
String updator;
/** 方法的参数列表 */
@Reference
List
parameters;
......
}
@Entity
public class ParameterDefinition implements Serializable {
@Id
Integer id;
/** 参数名 */
String name;
/** 参数类型 */
FieldType type;
......
}
spring-beans-test.xml的内容
xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
3,注意点
@Embedded
在一个对象中引用别的对象,但是不会建立引用表,也不建立外关联,有冗余,但不用考虑主表和参照表的一致性,关联实体上标示@Embedded
@Reference在一个对象中引用别的对象,首先需要建立引用表数据,会通过id建立外关联,考虑主表和参照表的一致性,关联实体上标示@Entity如上
query.field("creator").equal("liu");和
query.filter("creator =","liu");是一样的效果
其他参看上面代码,或者登陆http://code.google.com/p/morphia/查看使用细节或源代码