morphia

在我先前关于Morphia的帖子中 ,我介绍了一些典型用法,并提到了一些已知问题的警告和解决方法。 我展示了使用Morphia的工作有多么容易,以及它与Java世界的交互方式有多么干净。

为了跟进该帖子的后续内容,我将讨论如何处理一些现实生活中的需求:处理更改的架构并自定义映射以处理诸如只读字段之类的事情,并用复杂的对象替换简单的字段。

变更架构

几乎所有在开发领域中使用过数据库的人都知道,模式一直在发展。 不推荐使用或完全删除字段,过时的表,添加新的字段等等。

尽管通过使用像MongoDB这样的无模式数据存储可以避免很多麻烦,但有时我们仍然需要对更改进行特殊处理,而对于Morphia,我们本质上已经定义了模式,因此我们必须找到处理方法。这个。 最好的一点是,Morphia使它非常干净和容易,比您在任何ORM中所看到的都要容易。

弃用字段

一个很好的例子是已弃用的字段,而该字段已被另一个字段替换。 假设您有一个错误跟踪系统,其中包含如下所示的文档:

{_id:1,desc: "IE Rendering broken on intranet site",componentName: "INTRANET",dateCreated: ISODate("2011-09-06T20:52:50.258Z")
}

这是Morphia的定义:

@Entity("issues")
class Issue {@Id private long id;private String desc;private String componentName;private Date dateCreated = new Date();
}

现在想象一下,我们决定取消component字段,并使它成为更通用的自由文本字段,用户可以在其中输入多个组件,版本或其他有用的信息。 我们不想只是将其放在组件字段中,因为这会导致混乱。

值得庆幸的是,我们在Morphia工具包中有一个专门为此而制作的东西– @AlsoLoad批注。 此批注允许我们用多个可能的来源之一填充POJO字段。 我们只需更新Morphia映射以指示旧字段名称,就可以轻松删除对旧字段的引用而不会破坏任何内容。 这样可以使我们的代码和文档保持整洁。

@Entity("issues")
class Issue {@Id private long id;private String desc;@AlsoLoad("componentName") // handle old componentName fieldprivate String affects;private Date dateCreated = new Date();
}

因此,这里我们定义了旧字段的自动翻译,而无需更新文档或在POJO类中编写特殊逻辑以根据创建时间的不同来处理文档。

一个重要的提示:在这个例子中,如果这两个领域的影响和旧的组件名称字段存在,吗啡会抛出异常,所以不要尝试使用这种比自嘲领域,或者填充单场有两个相互排斥的任何其他属性。

仅支持不赞成使用的字段

另一种可能性是,您只需要在文档中支持应用程序不再写的旧字段即可。 这是一个非常简单的方法:使用@NotSaved批注。 当您在字段上使用它时,数据将被加载但Morphia不会写入。

在前面的示例中,我们很容易决定仅支持旧字段的显示,而不将其填充到情感字段中,因此让我们对Morphia POJO进行一些更改以显示如何使用@NotSaved

@Entity("issues")
class Issue {@Id private long id;private String desc;private String affects;@NotSaved("componentName") // load old componentName field for display onlyprivate String componentNameprivate Date dateCreated = new Date();
}

用嵌入式对象替换字段

现在,如果我们的componentName 字段实际上已更改为具有名称,版本和内部版本号的复杂组件对象? 这有点棘手,因为我们想用多个替换一个字段。 我们不能尝试从多个来源加载字段,因为它们具有不同的结构。 当然,我们可以使用嵌入式对象来存储复杂的组件信息,但是如何使代码无缝地工作而又不必更新文档?

在这种情况下,最简单的方法是使用三个注释的组合。 首先,我们将使用@NotSaved批注标记旧字段,并引入一个新的嵌入式组件 对象使用@Embedded注释 ,最后利用Morphia提供的另一个注释– @PostLoad 。 这使我们有了一种从MongoDB填充POJO之后执行的方法。

例子如下:

@Entity("issues")
class Issue {@Id private long id;private String desc;private String affects;@NotSaved("componentName") // load old componentName to convert to componentprivate String componentName@Embedded // our new complex Componentprivate Component component;private Date dateCreated = new Date();// getters and setters ...@PostLoadprotected void handleComponent() {if (component == null && componentName != null) {component = new Component(componentName, null, null);}}
}class Component {private String componentName;private Long version;private Long buildNumber;public Component(String componentName, Long version, Long buildNumber) {// ...}// getters and setters ...
}

在这种情况下,我们可以删除componentName字段的getter和setter,以便我们的映射对象仅公开新的和改进的接口。

结论

通过使用Morphia通过其注释支持为我们提供的强大工具,我们可以实现以下目标:

  1. 让我们的文档结构适应应用程序并保持整洁。
  2. 在我们的Java代码中无缝处理不断变化的结构,而无需容易出错的代码。
  3. 在支持旧模式的同时仅公开新模式(确实淘汰了旧代码和字段)。

希望这可以帮助您中的一些人适应不断发展的文档,或者至少可以更熟悉这些Morphia注释为您提供的功能。

参考: Morphia和MongoDB:来自我们的JCG合作伙伴 Crafe Flichel(来自Carfey软件博客)的 不断发展的文档结构

翻译自: https://www.javacodegeeks.com/2012/01/morphia-and-mongodb-evolving-document.html

morphia

morphia_Morphia和MongoDB:不断发展的文档结构相关推荐

  1. Morphia和MongoDB:不断发展的文档结构

    在上一篇有关Morphia的文章中 ,我介绍了一些典型用法,并提到了一些已知问题的警告和解决方法. 我展示了使用Morphia多么容易,以及它与Java世界的交互方式. 为了跟进该帖子,我将讨论如何处 ...

  2. mongodb查询内嵌文档

    mongodb查询内嵌文档 假设有这样一个文档: db.XXX.remove(); db.XXX.insert({"id":1, "members":[{&qu ...

  3. mongodb 查询内嵌文档

    原文:http://www.cnblogs.com/silentjesse/p/3598399.html mongodb查询内嵌文档 假设有这样一个文档: db.XXX.remove(); db.XX ...

  4. mongodb 基本概念:文档(Documents)

    mongodb将数据存为BSON 文档格式,BSON 是json文档的二进制格式,但是比json支持更多数据类型,详见:bsonspec.org 1.数据结构 mongodb文档由键值对组成 {fie ...

  5. Python工程的文档结构

    Python工程的文档结构,可以参考https://stackoverflow.com/questions/193161/what-is-the-best-project-structure-for- ...

  6. html格式文档结构保存数据库6,freeCAD文档结构

    一个freecad文档包含了你场景中的所有物体.它可以包含组及任何工作平台制造的物体.你可以切换工作台,但是它仍然工作在同一个文档上.当您保存您的工作时,该文件就被保存到磁盘上.你可以同时打开多个fr ...

  7. HTML的简介、文档结构及基本标记

    HTML的简介 HTML是英文 HyperText Markup Language 的缩写,它的意思是"超文本标记语言",用它编写出文档的文件的扩展名是".html&qu ...

  8. HTML5表格摘要是什么,HTML5文档结构 摘要

    --声明文档结构类型 ... html 初识 文档结构 常用标签 HTML初识 △HTML: 超文本标记语言,是一种用于创建网页的标记语言,不是编程语言,没有逻辑 本质上是浏览器可识别的规则 我们按照 ...

  9. HTML5文档结构主体结构 语义结构,html5组织文档结构.pdf

    html5组织文档结构 1 / 10 html5 组织文档结构 文档部分,即 body 部分,包含了访问者可以看到的内容.传统的 HTML 文档通常通过 div 元素来组织文档结构,再配 上适当的样式 ...

最新文章

  1. Five Hundred Miles——The Innocence Mission
  2. MPU6050参考代码
  3. python pkl是什么类型的文件?怎么来打开它?(使用numpy和pickle都能打开)
  4. 系统运维tips 3 之 innodb
  5. Java Jvm虚拟机的内存模型概述 《对Java的分析总结》(一)
  6. python 商城_python 开源商城安装
  7. android 移除泛型中元素_最新(2020)Android高级面试知识点干货分享(二)
  8. bzoj4152 [AMPPZ2014]The Captain
  9. Atitti.数据操作crud js sdk dataServiceV3设计说明
  10. 小红书用户画像分析_棋牌游戏如何做好用户画像分析?
  11. ​17 款程序员神级 Chrome 插件,爱了爱了!
  12. 使用微软原生工具,反编译DLL并修改后再生成DLL
  13. JDK1.8下载、安装和环境配置教程
  14. 公司专利技术交底书撰写及申请完全流程
  15. win10共享打印机搜索不到计算机,大师告诉您Win10搜不到共享打印机的操作方案...
  16. python对气象工作有没有用_Python语言在气象资料下载中的应用
  17. Task ‘bulid‘ not found in root project ‘cas‘. Some candidates are: ‘build‘.
  18. linux文件解压与压缩命令
  19. VLAN访问控制列表
  20. 5047. 多边形三角剖分的最低得分

热门文章

  1. C#的类修饰符和成员修饰符
  2. 【最全最详细】publiccms常用的代码片段
  3. 优秀学生专栏——王浩
  4. 判断个十百千位之后是否大于20 java——CSDN博客
  5. (转)springboot:添加JSP支持
  6. tomat(16)关闭钩子
  7. selenium 替代品_每个人都在谈论Selenium替代品-明智地选择!
  8. apache spark_Apache Spark中的自定义日志
  9. layui绑定json_JSON绑定:概述系列
  10. 参数化测试 junit_使用JUnit 5进行更清洁的参数化测试