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

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

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

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

相关文章

PC端网页vue项目,页面滚动点击悬浮按钮最快的方法

业务场景,可视化大屏右下角添加一个悬浮按钮,点击按钮页面滚动到顶部。 经过实验,使用锚点是最简单的办法。 方法一:锚点 给顶部的合适位置添加一个 name="top"的锚点,maodianTop用于控制样式,可以不设置。 <a class="maodianTop" name="…

Echats给柱状图及提示文字添加百分号(%)的解决办法

业务需求&#xff1a;给柱状图添加百分号。 目录 柱状图上添加%效果图 悬浮标签添加%效果图&#xff1a; 刚开始从后台取的数据带%&#xff0c;我这边取这个值的时候显示undifined&#xff0c; 后来就让这哥们把这类的数据从数据库把%去掉。这样我这边就取到了数据&#xff0…

前端使用linux命令更新项目生产包与测试包命令

业务需求&#xff1a;把vue开发的项目打成dist.zip文件&#xff0c;丢到服务器去&#xff0c;通过域名进行访问。 首先登录云管平台的账号和密码&#xff0c;找到对应的服务器&#xff0c;然后连接到堡垒机。 在命令行进入到域名下的地址及目录。 切换到测试文件夹 点击左上角…

servle 3.0 新特性之一 对上传表单的支持

1. 上传 * 上传对表单的要求&#xff1a; > method"post" > enctype"multipart/form-data"&#xff0c;它的默认值是&#xff1a;application/x-www-form-urlencoded > <input type"file" name"必须给"/> * 上传Servle…

manifest.mf._MANIFEST.MF和feature.xml版本控制规则

manifest.mf.我永远都忘记了OSIF插件和功能的 MANIFEST.MF和feature.xml中的依赖项声明的规则是什么。 谷歌搜索经常导致沮丧而不是答案。 因此&#xff0c;因为今天我实际上找到了这些规则的简要列表&#xff0c;所以我想在这里重新发布它们&#xff0c;并进行一些较小的修改以…

CSDN学习神器——CSDN浏览器助手测评体验

导读&#xff1a;大家好&#xff0c;我叫孙叫兽&#xff0c;本期内容给大家分享一下CSDN浏览器助手这款插件&#xff0c;看看最新版的插件已经比较完善了&#xff0c;还有一些可以优化的地方。下面简单进行体验一把最新版&#xff01; 体验时间&#xff1a;2021年5月31日。 目录…

CVE-2016-0143 漏洞分析(2016.4)

CVE-2016-0143漏洞分析 0x00 背景 4月20日&#xff0c;Nils Sommer在exploitdb上爆出了一枚新的Windows内核漏洞PoC。该漏洞影响所有版本的Windows操作系统&#xff0c;攻击者利用成功后可获得权限提升&#xff0c;微软在4月补丁日修复了该漏洞。 0x01 漏洞分析 Nils Sommer并没…

HB-X打不开的解决办法

导读&#xff1a;今早点击HB-X这款编译器的时候&#xff0c;点击快捷键和图标按钮一点反应都没有。死活打不开。 点击的时候一点提示都没有&#xff0c;重启电脑打开也是如此。 解决办法&#xff1a; 关机重启&#xff0c;一定要关机再重启。 其它情况请参考这个帖子&#xff…

Spark 101:它是什么,它做什么以及为什么起作用

最近&#xff0c;许多大数据的讨论都使用了新名称。 有人将流行的新来者Apache Spark ™视为Hadoop的更易用&#xff0c;功能更强大的替代品&#xff0c; Hadoop是大数据的首选原始技术。 其他人认为Spark是Hadoop和其他技术的有力补充&#xff0c;它具有自己的优点&#xff0c…

【iCore3 双核心板_ uC/OS-III】例程五:软件定时器

实验指导书及代码包下载&#xff1a; http://pan.baidu.com/s/1eSHenjs iCore3 购买链接&#xff1a; https://item.taobao.com/item.htm?id524229438677 转载于:https://www.cnblogs.com/xiaomagee/p/5453762.html

前端 vue 在可视化大屏领域的工作实践

导读:最近入职了一家互联网公司,主要是做物联网及互联网解决方案方向,我上来就接手了这个项目,是一个可视化管理地图,主要用于某国企物业的安全预警的职能,说来也比较倒霉,刚来这公司,公司做这个项目的前端和后端都跑路了,然后让我一个月给他整改完,说是重构吧,还不…

JavaScript GetAbsoultURl

var img document.createElement(A);img.src "/img/weixin.jpg"; //设置相对路径给Image, 此时会发送出请求url img.src; //此时相对路径已经变成绝对路径img.src null; //取消请求console.log(url);转载于:https://www.cnblogs.com/shidengyun/p/5453901.html…

【Java从入门到天黑|05】JavaSE入门之面向对象(上)

面向过程&面向对象 语言的进化发展跟生物的进化发展其实是一回事,都是”物以类聚”。相近的感光细胞聚到一起变成了我 们的眼睛,相近的嗅觉细胞聚到一起变成了我们的鼻子。 语句多了,我们将完成同样功能的相近的语句,聚到了一块儿,便于我们使用。于是,方法出现了! …

java自建ocr完整示例_Java 7:完整的invokedynamic示例

java自建ocr完整示例我当前的Java 7系列中的另一个博客条目。 这次它处理的是invokedynamic&#xff0c;这是JVM上用于方法调用的新字节码指令。 invokedynamic指令允许呼叫站点与呼叫接收者之间的动态链接。 这意味着您可以将正在执行方法调用的类链接到在运行时正在接收调用的…

【Java从入门到天黑|05】JavaSE入门之面向对象(下)

修饰符 1、static修饰符 1、static变量 在类中,使用static修饰的成员变量,就是静态变量,反之为非静态变量。 静态变量和非静态变量的区别 静态变量属于类的,"可以"使用类名来访问,非静态变量是属于对象的,"必须"使用对象来访问. 1 public class Student{…

机电传动控制大作业 第一阶段

机电传动控制大作业 第一阶段 一&#xff0e;系统硬件接口定义1.电梯内操作界面: 标有1-7数字的按钮&#xff08;每个按钮有一个LED灯&#xff0c;按下按钮灯即亮&#xff09;,开门&#xff0c;关门以及紧急报警的按钮和楼层指示的LED数码管。电梯门的打开和关闭需要两个行程开…

对后台返回的数据进行评分排序、时间排序!

导读:对后台返回的数据进行评分排序,时间排序,可以倒序,可以正序。 按照评分排序 正序 qualityScoreSort(){this.tableData0.sort((a, b) => {return b.qualityScore - a

@Deprecated新外观可能是什么?

JDK增强建议 &#xff08;JEP&#xff09;277&#xff08;“ 增强的弃用 ”&#xff09;建议“重新定义弃用注释&#xff0c;并提供工具来增强功能生命周期的尾端。” 当前 java.lang.Deprecated的一些限制使我困扰了一段时间。 我特别希望能够使用Deprecated提供文本&#xff…

C++反汇编书

1、 《C反汇编与逆向分析技术揭秘》 2、 转载于:https://www.cnblogs.com/cppskill/p/5459867.html

前端工程师直线学习路径

想自学前端?却不知道学习路径。报个班吧,又怕被坑。一张学习前端路径是带你少走N条弯路。最近两年,前端技术和三大框架地位趋于稳定,推荐这个前端开发学习路径。 新手自学前端的五大阶段。 第一阶段 想成为一名前端开发人员,第一步就是网页布局和效果实现。这时候你需要学…