JPA 持久化 E01:实体图与批量读取
实体图与批量读取:先确定申请页,再加载明细 采购审批列表一页只需二十条申请,可页面还需要每条申请的商品明细。把关联改成 EAGER,可能让所有读申请的操作都付出明细加载成本;保持 LAZY,循环渲染时又可能出现 N+1 次 SQL。把 JOIN FETCH 直接拼进分页查询,看似同时解决两个问题,实际上分页的对象是 SQL 行还是申请实体,必须先说清。选修 E01 接在 05 篇的查询与分页 和 06 篇的抓取与 N+1 后面,只处理“这一页审批列表要加载哪些关系”这一决策,不把实体图包装成数据库限量或权限机制。 本篇源码、迁移、脚本与测试可从固定版本完整归档取得;版本 1b08ada,SHA-256 见源码清单。 例子沿用 JPA 累计工程:租户甲有申请 101、102、103,分别有两条、一条、三条明细,租户乙还有一份申请。审批页面按 id 升序取租户甲前两条,期望得到 101 与 102 及各自完整明细,而不是取“SQL 返回的前两行”——那样 101 的两条明细就可能占满第一页。如果有人新增或删除申请,跨请求偏移分页会发生漂移;本篇不假设一次请求以外有稳定快照。生产数据的...
软件建模E10:架构描述标准与文档框架
同一套租赁代码可以画出多张准确的图,评审仍然可能遗漏问题。客服询问重复提交是否产生两次预留,开发者看到类关系,运维看到部署节点,却没有人说明重启后的回执从哪里恢复。图本身没有画错,缺失的是从问题到答案的组织关系。 第 E09 篇建立了与真实 HTTP 实验一致的多视图。本篇继续使用这份实现,将干系人、关注点、视点、视图、决策和质量场景放入一份可检查的描述。实验目标是拒绝遗漏关注点与矛盾边界;它不构成标准认证,也不以文档完整代替运行能力。 三份资料各自解决什么问题 ISO/IEC/IEEE 42010:2022 面向架构描述。本篇读取了 ISO 官方公开摘要,用它确认标准主题和版本,没有读取付费标准全文,因此不逐条声称满足规范条款。公开摘要能够支持术语方向,不能代替完整符合性评估所需的条文、解释与审查证据。 SEI 的 Views and Beyond 关注以视图为基础记录架构,同时记录超出单张视图的信息。本文依据 Paul Clements 等人的第二版官方书目介绍与 SEI 培训说明。引用范围限于已读取资料,不把其他作者著作误写成这本书。对当前样例有用的部分,是按读者需要选择...
软件建模E09:4+1 与 C4 的多视角表达
租赁确认只有一个入口,也会产生不同问题:客服关心重复提交会不会预留两次,开发者关心规则在哪个类里,运维关心服务跑在哪台机器、重启会丢掉什么。把这些答案挤到一张图中,类、进程和节点很容易变成同一种方框,图越完整,含义反而越不确定。 第 38 篇提供了可执行基线:真实 HttpClient 经回环网络调用 HttpServer,模块门面调用 RentalApplication,后者使用内存仓储。客户端与服务器位于同一个 JVM,维修检查是本机固定函数,发布操作只写内存轨迹。本篇从这份代码建立多视图目录,并用实际运行日志检查图中的身份、所有权、边界和请求路径。 视角与抽象层次分开选择 Kruchten 的 4+1 视图模型以逻辑、进程、开发、物理视图描述不同关注点,关键场景把它们联系起来。逻辑视图说明业务抽象及关系,进程视图关注运行时并发与同步,开发视图说明源码组织,物理视图说明软件怎样映射到硬件。场景既能说明既有决定,也能暴露需要修改的决定。 C4 的上下文、容器、组件和代码属于不同抽象层次。它首先帮助读者逐步放大系统,而不是给运行、安全、开发等关注点各分一层。组件图可以表达逻辑分...
软件建模E08:用DMN真实执行资格规则与阈值变更
设备已经放行,距离预约开始还有一小时,是否允许进入下一步?如果政策要求至少提前一小时,答案是允许;政策改成两小时之后,同一输入就应被拒绝。用图表表达规则,必须能观察到这项变化影响实际求值结果。 本篇选择受限 DMN 决策表实验:两个输入、一个输出和三条规则。模型由真实 Camunda DMN 引擎解析执行,程序检查阈值边界、规则重叠和缺少输入的行为。样本没有启动完整流程平台,也没有调用租赁服务完成真实预订。 先确定需要执行的语义 一项租赁申请可以包含多种问题。领取、归还和通知需要描述先后动作;工作人员处理资料不完整的申请时,可能根据新材料选择后续工作;资格政策则根据输入条件得到判断。这些问题分别涉及流程、案例与决策建模,不应因为三者都能画图就互相替代。 当前问题只需要计算资格,没有等待、人工任务、消息关联或运行中的实例状态。因此实验选择 DMN 决策表,将操作顺序留在应用层。关于 BPMN 或 CMMN 的语义,本篇仅作范围区分,没有声称执行或验证过它们的引擎行为。OMG BPMN 2.0.2;OMG CMMN 1.1 模型使用 DMN 1.3 的 XML 命名空间。OMG 发...
软件建模E07:REA资源、事件与代理的交换语义
一笔租赁已经收取两百分钱,同时已经提供两小时设备使用服务。这两个事实有关联,但不能直接相加。四小时服务的承诺也不能因实际只提供两小时,就被改写成两小时。交换模型需要保存各自的资源、单位、参与方以及承诺与实际发生的联系。 REA 提供了一组观察经济交换的概念。本文依据原始研究辨认这些概念,再建立一个小型合成样本,检查部分履约、重复事件、超额履约和价格义务变化。脚本只是本篇受限解释的校验器,没有声明实现完整 REA 本体或会计系统。 原始概念与本篇的取舍 McCarthy 在一九八二年的论文中提出资源、经济事件、经济代理及其关系。作者网站提供原论文,并把后续扩展研究单独列出。Geerts 与 McCarthy 的扩展分析讨论了经济交换、对偶关系以及承诺等概念;承诺属于扩展部分,不能把所有后续机制都归到最初论文。作者资料与原始论文入口 资源关注具有经济价值的对象,事件描述经济变化,代理参与交换。对偶关系把一次交换中付出与获得的事件联系起来。扩展研究还区分已发生、已承诺与政策层面的可能或应当发生;这些区分有助于避免把愿望、义务和实际结果放进同一条记录。Geerts与McCarthy,扩...
软件建模E06:Feature Model与软件产品线
一套租赁软件同时提供门店自提、配送和跨境租赁,并不意味着每个交付版本都可以随意组合这些能力。配送需要地址,跨境需要配送与保险,取货方式又只能选择一种。只列出功能名称,无法解释为什么某个组合不能交付。 本篇把这些教学政策写成有限特性模型,枚举全部配置并检查反例。实验回答哪些产品组合被允许,不实现跨境业务,也不把一个特性名称视为已经交付的功能。 特性模型描述一族产品 FODA 原始报告通过领域分析寻找相关系统的共性与差异,并使用特性表达可选、必需及替代关系。它讨论的是一族系统的变化空间,不能只把一份待办事项表换个标题就称为产品线。Kang 等,FODA Feasibility Study,1990 租赁样本保留七个布尔变量:Rental、Booking、Pickup、Delivery、Address、Insurance、CrossBorder。Rental 是根,Booking 为根下面的必选能力。Booking 生效时,Pickup 与 Delivery 恰好选一个;Address、Insurance 与 CrossBorder 则可以按配置选择。 树状结构还不够。Deliver...
软件建模E05:本体、知识图谱与语义建模
租赁目录里只有一句“第二台相机属于相机类”,没有序列号。这可能表示资料还没收齐,也可能违反登记接口的必填规则。两种判断依赖不同问题:已有知识能够推出什么,以及当前数据是否满足交付要求。 本篇使用合成设备目录,实际运行 RDFLib、OWL-RL 与 pySHACL。实验既保存推导出的分类和关系,也保留缺字段的校验报告。它没有访问真实资产系统,更没有把图谱查询结果接入主线预订事务。 从关系事实到本体公理 RDF 图由主语、谓语、宾语三元组组成;命名资源使用 IRI,序列号这样的值可以使用字面量。这里的 Camera、Equipment、alice 和 camera1 都有独立标识,owns 表示主体拥有设备。名称的可读性便于人检查,机器依赖的仍是完整标识与关系。RDF 1.1 Concepts models/E05/rental.ttl 明确写出 camera1 是 Camera,Camera 是 Equipment 的子类,alice 拥有 camera1。数据没有显式写“camera1 是 Equipment”,也没有直接声明 alice 属于 Party。这给实验留下可以核...
软件建模E04:EMF最小工具链,Ecore与XMI的真实往返
一份 XML 能被解析,并不说明其中的预留对象满足必选引用;一组预留满足 Ecore 的结构约束,也不说明它们没有占用同一设备的重叠时段。模型工具解决了哪些问题,需要通过实际装载、诊断和往返结果分别判断。 本篇使用 Eclipse EMF 的真实运行库读取租赁元模型与实例,制造缺少编号、缺少引用和时段重叠三个反例,然后保存元模型与实例,在新的资源集合中重新加载。业务规则由明确的 Java 检查补充,没有把自制 JSON 程序称为 EMF,也没有运行 Xtext 或 OCL。 固定的是一组组件版本 实验固定 org.eclipse.emf.common 2.42.0、org.eclipse.emf.ecore 2.39.0 与 org.eclipse.emf.ecore.xmi 2.39.0。三个组件的版本号不要求相同;Ecore 2.39.0 的发布 POM 明确依赖 Common 2.42.0,XMI 2.39.0 则依赖 Ecore 2.39.0。Ecore发布POM 下载来源为 Maven Central 的对应固定坐标。每个 jar 与仓库公开 SHA1 对照后,再锁定...
软件建模E03:TLA+有限模型检查,找到重复承诺的执行次序
两个请求先后检查同一台设备,都看到可用,然后分别提交预留。每个请求单独运行都没有问题;交错运行时,却可能同时得到承诺。测试某一条执行顺序,只能说明那次运行的结果,不能代替对模型所允许次序的检查。 本篇使用真实 TLC 检查器执行一个 TLA+ 有限模型。未保护版本产生五个状态的重复承诺反例,增加提交时的原子检查后,检查器遍历完指定范围,没有发现违反不变量的状态。两个结果都保留原始输出与进程退出码。 先固定工具和观察范围 实验冻结官方 TLA+ tools 发布标签 v1.7.4,下载其中的 tla2tools.jar。运行横幅显示的是组件版本 TLC2 Version 2.19、修订 5a47802;发布包版本与组件横幅不是同一编号。这里使用一个固定历史版本,不以“最新版本”作为可复现条件。官方1.7.4发布页 下载文件先与发布页的 SHA1 对照,再把实际 SHA256 写入工具锁。读者入口从固定官方 URL 下载缺失文件,运行前总会核对 SHA256;jar 放在外部缓存,不进入示例源码。实际运行使用 Corretto Java 21.0.11,命令行和 Java 版本另存...
软件建模E02:维度建模,粒度与历史怎样改变报表
两项预留各结算 200 元,日报中的租金合计也是 400 元。把日报与结算表按预留编号连接,结算金额却变成 600 元。SQL 没有语法错误,外键也全部有效,错误来自连接两端记录代表的事情不同。 本篇把设备租赁数据整理为一个可执行的 SQLite 分析样本,再施加门店归属变更。实验区分按天确认的收入、按预留结算的金额及设备归属版本,检查粒度混算、历史改写与晚到事实的影响。金额全部使用整数分,教学样本不涉及税费、折扣或汇率。 先说清一行代表什么 rental_day 的一行表示某项预留在某个服务日确认的收入。R1 跨两天,每天 100 元,因此有两行;R2 只占一天,收入 200 元,因此有一行。主键是预留编号与服务日,但业务解释先于这组键:它记录一天的收入事实。 settlement 的一行则表示一项预留的结算金额。R1、R2 各有一行、各 200 元。这个表不能直接承载任意多次付款或退款;若结算支持分期,应重新声明粒度并调整唯一性。字段名称叫金额,不足以说明它可以与另一张表里的金额逐行相加。 Kimball 将粒度定义为单行事实代表的测量事件,并要求候选事实和维度与之保持一致...










