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

在上一篇有关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();
}

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

值得庆幸的是,我们在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: Carfey软件博客上来自我们JCG合作伙伴 Craig Flichel的不断发展的文档结构


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/373780.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

angular 点菜_Vue2与Angular5实现无人点餐、无人收银系统项目实战视频教程【组合套餐】(大地)...

Vue2实现无人点餐、无人收银系统项目实战视频教程详情地址:Angular5实现无人点餐、无人收银系统项目实战视频教程详情地址:教程介绍:Vue2与Angular5实现无人点餐、无人收银系统项目实战视频教程【组合套餐】是由大地老师倾情录制的最新Vue2与…

CSDN挑战编程——《金色十月线上编程比赛第二题:解密》

金色十月线上编程比赛第二题:解密 题目详情: 小强是一名学生, 同时他也是一个黑客。 考试结束后不久,他惊讶的发现自己的高等数学科目居然挂了,于是他果断入侵了学校教务部网站。在入侵的过程中,他发现了与成绩相关的…

iOS学习心得——UITableViewCell的复用

UITableView是在iOS开发中最常用的控件之一。我的第一篇学习心得献给它了UITableView是由一行一行的UITableViewCell构成的。首先想这样一个问题:现在用UITableView去做一个联系人列表,如果我有10个100个联系人,那我可以建10个100 个UITab…

Java EE 7的高峰–使用EclipseLink的多租户示例

水族馆是有关所有相关规范和参考实现中有关Java EE进度的灵感和最新信息的重要来源。 他们从Oracle的Shaun Smith( 博客 / twitter )获得了关于EclipseLink作为开源项目的地位和未来的演讲。 他介绍了将在EclipseLink 2.4中提供的所有新功能,…

vscode中如何拉取git代码_使用VSCode如何从github拉取项目的实现

使用VSCode如何从github拉取项目的实现最近使用vscode进行前端编程,遇到一些问题网上说明的不是很明显,故记录一下1.开vscode使用CTRL或者点击查看到集成终端打开控制终端到此这篇关于使用VSCode如何从github拉取项目的实现的文章就介绍到这了,更多相关V…

matlab求导

在matlab中求导要进行符号运算。 >>syms x; >>y x^cos(x); >>ydot diff(y, x, 1);%对x求一阶导数 ydot x^(cos(x) - 1)*cos(x) - x^cos(x)*log(x)*sin(x) >> y2dot diff(y, x, 2)%求二阶导数,求n阶导数同理。 y2dot cos(x)*(x…

带有Java和Axis2的JSON Web服务

我最近遇到一位客户,要求我使用Java Web服务重建其旧产品。 他们希望它模块化并且易于使用。 我想到的第一件事是使用宁静的方法。 但是让我烦恼的是,Java宁静的方法是使用XML !,我更喜欢一种更简单的通信方式,易于理解和解析的数…

Kosaraju算法 有向图的强连通分量

有向图的强连通分量即,在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。非强连通图有向图的极大强连通子图,称为强连通分量(…

监管大屏系统_工厂大屏可视化管控系统,智慧工厂平台是什么,工厂管理大屏软件 - 帆软...

智慧工厂大屏可视化管控系统,不但注重显示数据显示信息能力,还要兼具监管的作用,配合时代新兴的大屏技术,早已成为精益生产工厂的必备产品。本文权威介绍智慧工厂大屏可视化管控系统是什么,以及3款主流软件&#xff0c…

图像二维离散傅里叶变换、幅度谱、相位谱

clear, clc I imread(...);F fftshift(fft2(I)); % 对图像进行二维 DFT(fft2),并移至中心位置 magn log(abs(F)); % 加 log 是便于显示,缩小值域 phase log(angle(F)*180/pi); % 转换为度数…

详解CSS选择器、优先级与匹配原理

选择器种类 严格来讲,选择器的种类可以分为三种:标签名选择器、类选择器和ID选择器。而所谓的后代选择器和群组选择器只不过是对前三种选择器的扩展应用。而在标签内写入style""的方式,应该是CSS的一种引入方式,而不是选…

关于299$的企业开发者账号的申请流程

299$的企业开发者账号 Apple Developer Enterprise Program•一年1988人民币 - 企业 (Apple Developer Enterprise Program)- 公司应在邓白氏注册并拥有有效的 DUNS 号码。-此计划使开发者能够开发针对 Apple 设备的应用程式,并对其员工进行发布&#xf…

keras 多层lstm_tensorflow-如何在keras中堆叠多个lstm?

DanielAdiwardana的答案的详细说明。我们需要为除最后一层之外的所有LSTM层添加return_sequences True。将此标志设置为True可让Keras知道LSTM输出应包含所有历史生成的输出以及时间戳(3D)。 因此,下一个LSTM层可以进一步处理数据。如果此标志为假,则LS…

Java堆空间– JRockit和IBM VM

本文将为您提供JRockit Java堆空间与HotSpot VM的概述。 它还将为您提供有关JRockit和HotSpot的Oracle未来计划的一些背景知识。 Oracle JRockit VM Java堆:2个不同的内存空间 -Java堆(YoungGen和OldGen) -本机内存空间(类池&am…

如何搭建lamp(CentOS7+Apache+MySQL+PHP)环境 [转]

在网上搜资料,自己在本地虚拟机上尝试搭建,弄了整整一天一夜,终于弄好了.网上的资料,虽然很多,但大多都是重复的,拿去试了之后,又很多都不能得到正确的结果.最终找到了适合我的linux环境的搭建方式;在这里贴出来:Install Apache, PHP And MySQL On CentOS 7 (LAMP)度娘真不给力…

为什么要用!DOCTYPE声明

实例&#xff1a; 我们经常会看到类似这样的代码&#xff1a; <!DOCTYPE html> <html> <head> <title>文档的标题</title> </head> <body> 文档的内容...... </body> </html>注解&#xff1a;可以看到最上面有一行关于“…

java 线程的开始、暂停、继续

Android项目中的一个需求&#xff1a;通过线程读取文件内容&#xff0c;并且可以控制线程的开始、暂停、继续&#xff0c;来控制读文件。在此记录下。 直接在主线程中&#xff0c;通过wait、notify、notifyAll去控制读文件的线程&#xff08;子线程&#xff09;&#xff0c;报错…

为什么要在Java中使用Unchecked异常而不是Checked异常

关于检查与未检查的异常的争论可以追溯到过去。 有人说这是Java包含的最佳功能之一。 其他人则说这是他们最大的错误之一[ 1 ]。 辩论似乎结束了。 在这篇文章中&#xff0c;我将尝试包含指向该主题的文章和书籍的链接。 我不是专家&#xff0c;但是我会尽力向您解释为什么我得…

batchplot插件用法_Batchplot批量打印怎么用?Batchplot批量打印教程

很多从事CAD设计工作的用户都碰到过这种情况&#xff1a;在一个单DWG格式的图纸文件中包含有大量图纸&#xff0c;如果一张一张选取打印不但费时费力&#xff0c;而且容易遗漏某张图纸&#xff0c;这时候就需要用到Batchplot插件&#xff0c;这是专门针对单DWG多图纸的批量打印…

选择排序和冒泡排序以及折半查找

1.选择排序 2.冒泡排序 3.折半查找 方式一&#xff1a;开发使用的方法 方式二&#xff1a;普通的折半 转载于:https://www.cnblogs.com/juncaoit/p/5935068.html