@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 文档。
再举一个@Embedded注解的例子
@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);
 
Mongo 中查看 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数据
展开显示:
注意:被引用的对象必须先被保存,然后其他对象才能引用它们。这解释了为什么我先保存 song1song2,然后将它们添加到 band

参考文章:

  1. https://www.ibm.com/developerworks/cn/java/j-morphia/
  2. https://blog.csdn.net/jsdxshi/article/details/73368937

Mongodb 的ORM框架 Morphia之注解的更多相关文章

  1. Mongodb 的ORM框架 Morphia 注解 之 @Reference

    public class BlogEntry { private String title; private Date publishDate; private String body; privat ...

  2. MongoDB的ORM框架——Morphia

    1.引入pom <dependency> <groupId>org.mongodb.morphia</groupId> <artifactId>morp ...

  3. Morphia - mongodb之ORM框架

    一.简介 二.注解 1.@Entity 2.@Id3.@Indexed4.@Embedded5.@Transient和@Property6.@Reference 三.示例 四.参考资料 Morphia ...

  4. 基于java注解实现自己的orm框架

    ORM即Object Relation Mapping,Object就是对象,Relation就是关系数据库,Mapping映射,就是说Java中的对象和关系数据库中的表存在一种对应关系. 现在常见的 ...

  5. Play Framework框架 JPA惯用注解

    Play Framework框架 JPA常用注解 1.@Entity(name=”EntityName”) 必须 ,name 为可选 , 对应数据库中一的个表 2.@Table(name=”" ...

  6. (动态模型类,我的独创)Django的原生ORM框架如何支持MongoDB,同时应对客户使用时随时变动字段

    1.背景知识 需要开发一个系统,处理大量EXCEL表格信息,各种类别.表格标题多变,因此使用不需要预先设计数据表结构的MongoDB,即NoSQL.一是字段不固定,二是同名字段可以存储不同的字段类型. ...

  7. 最好的5个Android ORM框架

    在开发Android应用时,保存数据有这么几个方式, 一个是本地保存,一个是放在后台(提供API接口),还有一个是放在开放云服务上(如 SyncAdapter 会是一个不错的选择). 对于第一种方式, ...

  8. [Android]Android端ORM框架——RapidORM(v2.0)

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5626716.html [Android]Android端ORM ...

  9. [Android]Android端ORM框架——RapidORM(v1.0)

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4748077.html  Android上主流的ORM框架有很多 ...

随机推荐

  1. Tomcat 多个虚拟主机配置方法

    conf/server.xml 移除注释内容后,类似内容如下: <Server> …… …… …… <Service name="Catalina"> &l ...

  2. 远程访问服务器tensorboard

    转自https://blog.csdn.net/Hansry/article/details/83004648 1. 在登录远程服务器的时候使用命令: : server_name@server.add ...

  3. ionic3使用@angular/http 访问nodejs(koa2框架)服务不能返回数据

    cordova的http插件不能使用在browser上,所以当需要在browser上浏览时,需要使用@angular/http 里的方法来访问nodejs服务. 如果出现服务端能够接收请求并相应,而客 ...

  4. spring 事物不回滚

    使用spring控制事物,为什么有些情况事物,事物不回滚呢?? 默认spring事务只在发生未被捕获的 RuntimeException时才回滚.   spring aop  异常捕获原理: 被拦截的 ...

  5. Linux通配符和关机命令

      通配符 | # 管道符,或者(正则) > # 输出重定向 >> # 输出追加重定向 < # 输入重定向 << # 追加输入重定向 ~ # 当前用户家目录 `` ...

  6. 涨姿势:Mysql 性能优化完全手册

    涨姿势:Mysql 性能优化完全手册 深入理解MySQL服务器架构 客户端层 MySQL逻辑架构整体分为三层,最上层为客户端层,诸如:连接处理.授权认证.安全等功能均在这一层处理. 中间层 MySQL ...

  7. airflow整体架构

    run命令运行过程 读取dag文件生成task依赖关系,然后生成封装airflow run的command命令,通过celery发送到executor端,重新执行该airflow run命令. sch ...

  8. The type 'System.Object' is defined in an assembly that is not referenced

    记录一个错误,报 The type 'System.Object' is defined in an assembly that is not referenced,[System.Runtime] ...

  9. C# 密码盐码加密

    每次新建账号密码的时候都需要获取一下新的盐码,之后用使用MD5为用户密码加密 /// <summary> /// 获取新的密码盐码 /// </summary> /// < ...

  10. Web漏洞扫描工具(批量脱壳、反序列化、CMS)

    一.什么是Web漏洞扫描工具 即是指“扫描Web应用以查找安全漏洞(如跨站脚本,SQL注入,命令执行,目录遍历和不安全服务器配置)的自动化工具”,其中许多可能是由不安全或不正确的编码和设计.另一方面, ...