Mongodb 的ORM框架 Morphia之注解
@Entity("bands")
public class Band {
@Id
ObjectId id;
String name;
String genre;
@Reference
Distributor distributor;
@Reference("catalog")
List<Song> songs = new ArrayList<Song>();
@Embedded
List<String> members = new ArrayList<String>();
@Embedded("info")
ContactInfo info;
@Entity("songs")
public class Song {
@Id
ObjectId id;
String name;
}
@Entity("distributors")
public class Distributor {
@Id
ObjectId id;
String name;
}
@Entity
注释是必需的。其声明了在专用MongoDB集合上该类作为文档将持久保存。在默认情况下,Morphia使用类名称来命名集合。
可以使用value 注释MongoDB集合名称,设置noClassNameStored为true,
如@Entity(value = "params",noClassnameStored=true)
@ID
@Id 注释指示 Morphia 哪个字段用作文档 ID。如果您试图持久保存对象(其 @Id 注释的字段为 null),则 Morphia 会为您自动生成 ID 值。
id 可以时ObjectId,也可以时String类型。
@Transient
类属性标记@Transient注释则表明这个字段将不被持久化到数据库。
Morphia 试图持久保存每一个它遇到的没有注释的字段,除非它们标有 @Transient 注释,才会不保存到数据库中。
没有任何注解的,就会默认持久化到数据库中,相当于使用 @Embedded注解,只不过用 @Embedded可以指定别名。
@Embedded
使用此注解说明成员对象将被视为嵌入的(embedded)。它会显示为集合中父文档的子集。
除非注释有@Transient或 @Reference,否则默认成员对象将被视为嵌入的(embedded)
@Entity("bands")public class Band { @Id ObjectId id; String name; String genre; @Reference Distributor distributor; @Reference("catalog") List<Song> songs = new ArrayList<Song>(); @Embedded List<String> members = new ArrayList<String>(); @Embedded("info") ContactInfo info;public class ContactInfo { public ContactInfo() { } String city; String phoneNumber;Band band = new Band();band.setName("Love Burger");band.getMembers().add("Jim");band.getMembers().add("Joe");band.getMembers().add("Frank");band.getMembers().add("Tom");band.setGenre("Rock");datastore.save(band);members List 看上去如下所示
"members" : [ "Jim", "Joe", "Frank", "Tom"]
info 属性是另外一个嵌入的对象。在本例中,我通过 info 值明确地设置 @Embedded 注释。这会覆盖文档中子集的默认命名,否则就会被称为 contactInfo。例如:
"info" : { "city" : "Brooklyn", "phoneNumber" : "718-555-5555" }
查询结果:
> db.bands.find();{ "_id" : ObjectId("4cf7cbf9e4b3ae2526d72587"), "className" : "com.bandmanager.model.Band", "name" : "Love Burger", "genre" : "Rock", "members" : [ "Jim", "Joe", "Frank", "Tom" ] }可以看到:ContactInfo 类缺少 @Entity 注释。这是故意而为的,因为我不需要 ContactInfo 的专用集合。它实例总是被嵌入 band 文档。@Entity(value = "MCH_Community_Clew", noClassnameStored = true)
public class CommunityClew extends MongoBaseEntity implements Serializable { private static final long serialVersionUID = 1L;
private long id;//id
private String mobile;
private String community;//社区
private String status;
private Date createTime;//加入时间
private Date modifyTime;//修改时间
private String modifyUser;//修改人
private String remark; //记录最新一次备注
}
public class CommunityClewRecord extends MongoBaseEntity implements Serializable {
private static final long serialVersionUID = 1L;
private long id;//id
private long fatherId;
private String beforeStatus;//之前状态
private String status;//当前状态
private String remark;//备注
private Date modifyTime;//时间
private String modifyUser;//修改人
@Embedded("records")
private List<CommunityClewRecord> communityClewRecords;
}
CommunityClewRecord record=new CommunityClewRecord(, , "测试", status, remark,now,user);
CommunityClew clew=new CommunityClew();
clew.setId(communityClewMongo.getMaxId()+);
clew.setCommunity(community);
clew.setMobile(mobile);
clew.setCreateTime(new Date());
clew.setStatus("待沟通");
clew.setCommunityClewRecords(record);
communityClewMongo.insert(clew);
对CommunityClew的communityClewRecords列表添加两条CommunityClewRecord记录,查询monggo标,结果如下:

@Reference
@Reference 注释说明对象是对另外一个集合中的文档的引用。在从 MongoDB集合中加载对象时,Morphia遵循着这些引用来建立对象关系。即引用的字段会根据内部建立的关系图,自动加载。
这就要求被引用的对象先保存,然后再把被对象赋值给引用的字段,包含引用字段的对象再保存。
如:
Band band = new Band();
band.setName("Love Burger");
band.getMembers().add("Jim");
band.getMembers().add("Joe");
band.getMembers().add("Frank");
band.getMembers().add("Tom");
band.setGenre("Rock");datastore.save(band);//持久化 查询:
> db.bands.find();{ "_id" : ObjectId("4cf7cbf9e4b3ae2526d72587"), "className" : "com.bandmanager.model.Band", "name" : "Love Burger", "genre" : "Rock", "members" : [ "Jim", "Joe", "Frank", "Tom" ] }Song song1 = new Song("Stairway");Song song2 = new Song("Free Bird");datastore.save(song1);datastore.save(song2);songs 集合,应该看到如下所示:> db.songs.find();{ "_id" : ObjectId("4cf7d249c25eae25028ae5be"), "className" : "com.bandmanager.model.Song", "name" : "Stairway" }{ "_id" : ObjectId("4cf7d249c25eae25038ae5be"), "className" :"com. bandmanager.model.Song", "name" : "Free Bird" }Song 还没有被 band 引用。我将它们添加到 band 并查看发生了什么:band.getSongs().add(song1);band.getSongs().add(song2);datastore.save(band);bands 集合时,应该看到songs 集合被保存为一个被称为 catalog 的数组,作为两个 DBRef。因为@Reference("catalog")起了一个别名,如果不设置括号中的名称,存储的引用catalog 的数组应该是songs。{ "_id" : ObjectId("4cf7d249c25eae25018ae5be"), "name" : "Love Burger", "genre" : "Rock", "catalog" : [ { "$ref" : "songs", "$id" : ObjectId("4cf7d249c25eae25028ae5be") }, { "$ref" : "songs", "$id" : ObjectId("4cf7d249c25eae25038ae5be") }], "members" : [ "Jim", "Joe", "Frank", "Tom"] }@Reference例子:@Entity(value = "MCH_Community_Clew", noClassnameStored = true)
public class CommunityClew extends MongoBaseEntity implements Serializable { private static final long serialVersionUID = 1L;
private long id;//id
private String mobile;
private String community;//社区
private String status;
private Date createTime;//加入时间
private Date modifyTime;//修改时间
private String modifyUser;//修改人
private String remark; //记录最新一次备注
@Reference
private List<CommunityClewRecord> communityClewRecords;
}
@Entity(value = "MCH_Community_Clew_Record", noClassnameStored = true)
public class CommunityClewRecord extends MongoBaseEntity implements Serializable { private static final long serialVersionUID = 1L;
private long id;//id
private long fatherId;
private String beforeStatus;//之前状态
private String status;//当前状态
private String remark;//备注
private Date modifyTime;//时间
private String modifyUser;//修改人
}
public boolean saveCommunityClewRecordAndCommunityClew(Map<String, Object> map) {
long id=MapUtils.getLong(map, "id");
String status = MapUtils.getString(map,"status");
String remark = MapUtils.getString(map,"remark");
String user = MapUtils.getString(map,"user");
long recordMaxId = communityClewRecordMongo.getMaxId();
CommunityClew clew = communityClewMongo.queryCommunityClew(id);
Date now=new Date();
CommunityClewRecord record=new CommunityClewRecord(recordMaxId+, clew.getId(), clew.getStatus(), status, remark,now,user);
communityClewRecordMongo.insert(record);
return communityClewMongo.saveCommunityClewByUpdate(record,user,id);
}
MCH_Community_Clew_Record数据

MCH_Community_Clew数据
展开显示:
song1 和 song2,然后将它们添加到 band。参考文章:
- https://www.ibm.com/developerworks/cn/java/j-morphia/
- https://blog.csdn.net/jsdxshi/article/details/73368937
Mongodb 的ORM框架 Morphia之注解的更多相关文章
- Mongodb 的ORM框架 Morphia 注解 之 @Reference
public class BlogEntry { private String title; private Date publishDate; private String body; privat ...
- MongoDB的ORM框架——Morphia
1.引入pom <dependency> <groupId>org.mongodb.morphia</groupId> <artifactId>morp ...
- Morphia - mongodb之ORM框架
一.简介 二.注解 1.@Entity 2.@Id3.@Indexed4.@Embedded5.@Transient和@Property6.@Reference 三.示例 四.参考资料 Morphia ...
- 基于java注解实现自己的orm框架
ORM即Object Relation Mapping,Object就是对象,Relation就是关系数据库,Mapping映射,就是说Java中的对象和关系数据库中的表存在一种对应关系. 现在常见的 ...
- Play Framework框架 JPA惯用注解
Play Framework框架 JPA常用注解 1.@Entity(name=”EntityName”) 必须 ,name 为可选 , 对应数据库中一的个表 2.@Table(name=”" ...
- (动态模型类,我的独创)Django的原生ORM框架如何支持MongoDB,同时应对客户使用时随时变动字段
1.背景知识 需要开发一个系统,处理大量EXCEL表格信息,各种类别.表格标题多变,因此使用不需要预先设计数据表结构的MongoDB,即NoSQL.一是字段不固定,二是同名字段可以存储不同的字段类型. ...
- 最好的5个Android ORM框架
在开发Android应用时,保存数据有这么几个方式, 一个是本地保存,一个是放在后台(提供API接口),还有一个是放在开放云服务上(如 SyncAdapter 会是一个不错的选择). 对于第一种方式, ...
- [Android]Android端ORM框架——RapidORM(v2.0)
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5626716.html [Android]Android端ORM ...
- [Android]Android端ORM框架——RapidORM(v1.0)
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4748077.html Android上主流的ORM框架有很多 ...
随机推荐
- 玩转MQTT-阿里云之MQTT使用
引言 前两年买一款物联网控制板,当时把玩了一阵之后,验证了下串口通讯.MODBUS协议实现.TCP/UDP/DNS/MQTT通讯(基于GPRS)后,就放到角落里吃灰了呵. 最近收到阿里云的优惠推送,说 ...
- 5、分布式缓存Redis之bitmap、setbit
基本语法: 1)SETBIT redis 127.0.0.1:6379> setbit KEY_NAME OFFSET VALUE //该命令用于对 key 所储存的字符串值,设置或清除指定偏移 ...
- C:指针遍历二维数组
C 指针遍历二维数组 http://blog.csdn.net/lcxandsfy/article/details/55000033 C++ 字符串指针与字符串数组 https://www.cnblo ...
- Service Worker 离线无法缓存Post请求的问题解决
许多非REST API甚至可以用于读取数据的POST请求:典型的例子是graphql.soap和其他rpcpapi.但是,Post请求不能在一个现成的渐进式Web应用程序中缓存和脱机使用.浏览器的缓存 ...
- How To Upgrade ASMLib Kernel Driver as Part of Kernel Upgrade? (文档 ID 1391807.1)
How To Upgrade ASMLib Kernel Driver as Part of Kernel Upgrade? (文档 ID 1391807.1)
- (转)MSSQLSERVER执行计划详解
原文地址:http://www.cnblogs.com/knowledgesea/p/5005163.html 序言 本篇主要目的有二: 1.看懂t-sql的执行计划,明白执行计划中的一些常识. 2. ...
- 2016蓝桥杯"取球博弈"问题
较难,网上有能得出正确结果的代码,但是读了一下,像是拼凑出的结果,逻辑不通,代码和注释不符 参考网上代码写了一版,结构相对清晰,注释比较详细 题目很长: 两个人玩取球的游戏.一共有N个球,每人轮流取球 ...
- VC工程产生文件后缀名解释
[原文出自http://hi.baidu.com/zj0932zj/blog/item/b55f33cc7753c01700e92870.html ] .APS:存放二进制资源的中间文件,VC把当前资 ...
- 1.Java
面向对象:封装,继承,多态 A组合B:那么B就可以调用A中的方法 A关联B:A中的成员变量是用B声明的 A和B的依赖关系:A中某个方法的参数是B声明的对象或者返回值类型是B的数据类型 Static方法 ...
- mybatis入门篇:mybatis动态SQL
1.if用法 <select id="selectUser" resultType="com.forest.owl.entity.User"> se ...

