修订和不变性

这是一个简短的帖子。 我不确定如何启动它。 这是审阅一些现有代码时“为什么我没有想到”的时刻之一。 由于存在NDA,我无法共享实际代码。 它与处理修订有关。 与我最相关的是WordPress(WP)如何处理博客文章和修订。

在WP中, wp_insert_post函数插入或更新帖子。 它检查ID字段以确定将执行INSERT还是UPDATE 。 如果帖子正在更新,它将检查是否进行了更改。 如果是这样, 则保存修订 。 可以设置要保留的修订数量的限制。 如果是这样,最旧的将被删除。

这听起来像可以建模为富域实体的事物。 这是第一次尝试。

@Entity
... class Post {@Id @GeneratedValue ... id;... name;... title;... content;... excerpt;... status; // e.g. 'draft', 'publish', 'inherit'... type; // e.g. 'post', 'revision'@OneToMany @JoinColumn(name="parent_post_id") ... List<Post> revisions;...// setters and getters
}
Post post = new Post();
post.setTitle("Lorem Ipsum");
post.setContent("...");
// save post
...
post = // retrieve existing post for updates
post.setContent("..."); // how can we ensure that revision is created?

在第一次尝试中,setter方法对确保在更新帖子时创建修订版提出了挑战。 让我们再试一次。 这是我们的第二次尝试。

// Immutable class
@Embeddable
... class PostData {... title;... content;... excerpt;// getters only... getTitle() { return title; }... getContent() { return content; }... getExcerpt() { return excerpt; }// equals() method to compare with another post data// to see if there are changes
}@Entity
... class Post {@Id @GeneratedValue ... id;... name; // for a revision, will contain parent ID and revision #@Embedded ... PostData postData; // read-only... status; // e.g. 'draft', 'published', 'inherit'... type; // e.g. 'post', 'revision'@OneToMany @JoinColumn(name="parent_post_id") ... List<Post> revisions;...... getTitle() { return this.postData.getTitle(); }... getContent() { return this.postData.getContent(); }... getExcerpt() { return this.postData.getExcerpt(); }... getName() { return name; }
}

这是我得到“为什么我没有想到那一刻”的时刻!

注意我们如何将发布数据封装为自己的类型PostData 。 这是一成不变的。 这样可以确保在更新帖子时创建修订。

PostData postData = new PostData("Lorem Ipsum", "...", "...");
Post post = new Post(postData);
// save post
...
post = // retrieve existing post for updates
// post.setContent("..."); // not possible
post.updateData(new PostData("...", "...", "...")); // ensure that revision is created

这就是我们创建修订的方式。

@Entity
... class Post {...@Embedded ... PostData postData; // read-only...@OneToMany @JoinColumn(name="parent_post_id") ... List<Post> revisions;...public Post(PostData postData) {this(postData, null);}/* package private */ Post(PostData postData, Post parent) {if (postData == null) {throw new IllegalArgumentException(...);}this.postData = postData;if (parent == null) {this.type = "post";this.status = "draft";this.name = null;this.revisions = new ArrayList<>();} else {this.type = "revision";this.status = "inherit";this.name = "" + parent.getId() + "-revision" + (parent.getRevisionsCount() + 1);this.revisions = null;}...}...... void updateData(PostData newPostData) {if (this.postData.equals(newPostData)) {// no changes, no revisions addedreturn;}...// creates a revisionPostData beforePostData = this.postData;this.revisions.add(0, new Post(beforePostData, this));// store latest changesthis.postData = newPostData;// limit to number of revisions to keepif (this.revisions.size() > ...) {// delete the excess onesfor (...) {this.revisions.remove(this.revisions.size() - 1);}}...}...
}

就像我说的,这是一篇简短的文章。 在下面的评论中让我知道您是否曾经看过它,或者像我一样,它给了您“为什么我没有想到那个”时刻。

翻译自: https://www.javacodegeeks.com/2018/11/revisions-immutability.html

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

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

相关文章

[渝粤教育] 西南科技大学 农业推广学 在线考试复习资料

农业推广学——在线考试复习资料 一、单选题 1.“ 百千万”示范是指在村建百亩( )。 A.示范片 B.试验田 C.示范区 D.示范方 2.一个随机区组试验有8个处理,四次重复,误差自由度是( )。 A.27 B.21 C.32 D.28 3.在推广教师的指导下,学员运用已有的知识、经验,从事一定的实践工作…

autowired注入为 mapper为null_兰新高铁为区域经济发展注入活力

央视网消息 &#xff1a;连接甘肃兰州至新疆乌鲁木齐的兰新高铁&#xff0c;是我国“八纵八横”高速铁路网的重要组成部分。开通运营近六年来&#xff0c;兰新高铁已累计运输旅客6760多万人次&#xff0c;在推动地区协调发展&#xff0c;便捷旅客出行等方面发挥了重要作用。乘坐…

[渝粤教育] 西南科技大学 制造业信息化导论 在线考试复习资料

制造业信息化导论——在线考试复习资料 一、单选题 1.产品设计应面向( ),与用户保持密切联系,将用户纳入产品开发过程,以多变的产品、尽可能短的交货期来满足用户的需要。 A.用户 B.供应商 C.销售商 D.物流 2.企业的生产、经营状况可通过其产品结构、产值产量、经营总额、利税…

织梦同步静态文件到服务器,某猫织梦插件-织梦dedecms静态文件生成速度的区块插件...

经常使用织梦的朋友都可能都知道织梦cms 的静态生成速度有时候让人无法忍受&#xff1b;如果是企业展的几百篇的文章&#xff0c;那当然绰绰有余&#xff0c;但是一般数据量打起来生成速度也会大幅的降低&#xff0c;与同类的其他cms比如说帝国cms&#xff0c;还有phpcms相比差…

[渝粤教育] 西南科技大学 动态网页设计(JSP) 在线考试复习资料

动态网页设计&#xff08;JSP&#xff09;——在线考试复习资料 一、单选题 1.下面关于通过JDBC访问数据库哪项说明正确? A.对数据库操作一定要驱动程序 B.对数据库操作一定要DriverManager.getConnection C.对数据库操作一定要ResultSet对象 D.对数据库的操作一定要调用存储 …

webpack 异步加载配置文件_详解webpack异步加载业务模块

虽然把我们用到的JS文件全部打包一个可以节省请求数&#xff0c;但如果打包后的JS文件过大&#xff0c;那么也容易出现白屏现象&#xff0c;许多操作失灵。而且一些区域是点到才出现&#xff0c;那么相关的JS其实可以剥离出这个大JS文件外。这就涉及到异步加载了。异步加载是SP…

[渝粤教育] 西南科技大学 基础工业工程 在线考试复习资料

基础工业工程——在线考试复习资料 一、单选题 1.线路图是以作业现场为对象,对( )进行分析。 A.现场布置及物料和作业者的实际流通路线 B.物料的加工路线 C.人员的流通路线 D.机器、工作台的相互位置 2.流程程序图是对生产现场的整个制造程序作( )的记录。 A.全面 B.大概 C.详…

antlr4 代码 语法树_使用ANTLR4,用于代码镜像和基于Web的DSL的Primefaces扩展

antlr4 代码 语法树DSL是很酷的东西&#xff0c;但我不清楚它们有什么用。 然后我意识到它们对以下方面有好处&#xff1a; 摆脱复杂的UI 意思是 更快的做事方式 而已。 当我阅读此博客时&#xff0c;我得出了这个结论。 如果您的用户是技术人员&#xff0c;并且不惧怕类…

[渝粤教育] 西南科技大学 工程力学 在线考试复习资料

工程力学——在线考试复习资料 一、判断题 1.平面图形的静矩与坐标系无关。 2.弯矩图上的极值就是梁内最大的弯矩。 3.悬臂梁或外伸梁的自由端处弯矩必定为零。 4.弯矩图应画在梁受拉的一侧。 5.当挤压面为圆柱形侧面时&#xff0c;挤压面的计算面积按该圆柱侧面的正投影面…

appium的python教程_移动App Appium自动化测试教程Appium+Python 【2018年新】_IT教程网...

资源名称&#xff1a;移动App Appium自动化测试教程AppiumPython 【2018年新】资源目录&#xff1a;第一章&#xff1a;App自动化测试概述1-1 Appium自动化课程简介1-2 课程大纲1-3 移动设备操作系统兴亡简史1-4 移动App自动化测试兵器发展历程1-5 移动App自动化测试兵器发展历…

Derby数据库备份

抽象 我已经发布了许多有关Derby的博客&#xff1a; 同一主机上的多个Derby网络服务器 Apache Derby数据库用户和权限 与Maven和内存中Derby数据库的集成测试 这本不打算是一个系列。 但是多年来&#xff0c;我越来越多地使用Derby。 最近&#xff0c;我开始将Derby用作微服…

[渝粤教育] 西南科技大学 市场营销理论与实务 在线考试复习资料2021版(1)

市场营销理论与实务——在线考试复习资料2021版 一、单选题 1.处于市场不景气或原料.能源供应紧张时期,( )产品线反而能使总利润上升。 A.增加 B.扩充 C.延伸 D.缩减 答案:看左边查询 2.以高于价值的价格将新产品推入市场,然后…

[渝粤教育] 西南科技大学 建筑经济与企业管理 在线考试复习资料

建筑经济与企业管理——在线考试复习资料 一、单选题 1.某建筑公司预计今后5年中,每年末拿出50万元作为生产基金,将其投资生产预制构件,投资年利率为12%。到第五年末,该公司共得( )万元 A.305.3 B.317.64 C.320.7 D.330 2.某公司拟投资一个项目,预计建成后每年能获利50万元…

cnn 一维时序数据_蚂蚁集团智能监控的时序异常检测:基于 CNN 神经网络的异常检测...

1背景在蚂蚁集团智能监控领域&#xff0c;时序异常检测是极重要一环&#xff0c;异常检测落地中&#xff0c;业务方参考业界标准输出 Metrics 指标数据&#xff0c;监控不同业务、应用、接口、集群的各项指标&#xff0c;包含 Metrics 指标(总量、失败量、耗时等)和系统服务指标…

[渝粤教育] 西南科技大学 投资经济学 在线考试复习资料(1)

投资经济学——在线考试复习资料 一、单选题 1.投资决策是经济决策的重要组成部分,是选择和决定( )的过程 A.投资资金 B.投资行动方案 C.投资机会 D.投资目的 2.下面属于第三产业的行业是( ) A.制造业 B.建筑业 C.农业 D.商业 3.重视资金的( )是正确确定项目成本和收益的不可…

python写图片爬取软件_python抓取整个网站图片

Python分布式爬虫原理转载 permike 原文 Python分布式爬虫原理首先&#xff0c;我们先来看看&#xff0c;如果是人正常的行为&#xff0c;是如何获取网页内容的。(1)打开浏览器&#xff0c;输入URL&#xff0c;打开源网页(2)选取我们想要的内容&#xff0c;包括标题&#xff0c…

[渝粤教育] 西南科技大学 数据库应用 在线考试复习资料

数据库应用——在线考试复习资料 一、单选题 1.“表达式生成器”是用来书写什么的? A.代码 B.程序 C.表达式 D.数据库 2.在使用计算控件时,每个表示式前必须加上哪种运算符号? A. B. C.? D.* 3.以下属于非绑定控件的是哪一个? A.文本框 B.单选按钮 C.组合框 D.直线控件 …

[渝粤教育] 西南科技大学 机械制造装备及工艺 在线考试复习资料

机械制造装备及工艺——在线考试复习资料 一、单选题 1. 金属切削过程中,工件材料的塑性或韧性越高,切屑越不易折断,使切屑与前刀面间的摩擦增大,故切削力( ) A.变化不定 B.增大 C.增小 D.不变 2. 金属切削过程中,在温度很高时,接触面间切屑底层金属呈…

JBoss模块很烂,无法在JBoss 7下使用自定义Resteasy / JAX-RS

由于JBoss EAP 6.1 / AS 7.2.0是模块化的&#xff0c;并且您可以排除Webapp可见的模块&#xff0c;因此您希望可以轻松地忽略内置的JAX-RS实现&#xff08;Rest Easy 2.3.6&#xff09;并使用它。自定义的&#xff08;3.0.6&#xff09;。 但是&#xff0c;可悲的是&#xff0c…

cad怎么将图层后置_CAD中如何将某1个图层置于其他图层之上.doc

CAD中如何将某1个图层置于其他图层之上《CAD一千零一个技巧》图层管理17种用法 CAD具备强大的图层工具功能&#xff0c;统计一共有17种&#xff0c;这17种应用大大地满足了用户编辑图层的需求&#xff0c;而这17种图层工具的具体应用&#xff0c;你都会吗&#xff1f;?1、图层…