持久化模式,第 1 部分: 现代 ORM 工具的策略和最佳实践

简介

在过去 5 到 10 年中,开发人员对企业应用程序中的实体进行持久化的方式发生了根本性变化。早期的企业应用程序使用数据库表和 表之间的外键关系进行实体建模。应用程序被看作查看和查询数据库底层模型的方式。近几年,数据库中的实体建模逐渐向应用程序对象 模型中的实体建模转变。现在大家已经意识到,数据库仅仅是存储对象结构所定义的持久化信息的一种机制。把建模从数据库转移到对象 模型中有许多优点,包括:

持久化实体与对它们执行的操作更紧密地集成

有助于创建松散耦合的应用程序组件

与关系数据库相比,面向对象模型支持更丰富的关系

更加独立于特定的数据库平台

发生这种转变的主要原因是出现了功能强大的对象-关系映射(ORM)系统,它们支持按照与目标语言的习惯用法一致的方式访问持久化 对象。Hibernate 和 TopLink 等工具大大简化了把对象模型映射到关系数据库模式的过程。

自从这些工具出现以来,使用它们的方法也有所变化。最初,许多开发人员按照使用数据库表的方式使用 ORM 工具。实体一对一地映 射到数据库表。对应于主键等字段的变量在各个实体中重复出现。因为数据库不支持与实体相关联的行为,领域模型最终只具有简单的变 量以及相关的 getter 和 setter 方法。这些实体的行为最终由服务或视图层实现。

在许多项目中使用 ORM 工具的经验揭示了处理这些问题的更好方法。业务领域各不相同,所以它们的领域模型和持久化方式也可能不 同,但也有相同之处。本文讨论应用于不同行业的许多领域模型的最佳实践。这里提供的最佳实践有助于产生更加一致、可重用且可维护 的领域模型。我们使用 Hibernate 演示这些最佳实践,但是许多概念可以应用于其他 ORM 工具。

本文分为两部分。第 1 部分讨论以下方面的一些基本概念:

实现领域中的通用功能

减少数据访问层中的 代码重复

按照一致的方式处理对实体修改的审计

第 2 部分 更深入地讨论这里介绍的一些概念,还要讨论领域模 型中的性能调优。

从基础开始:对象模型

定义一个支持持久化对象的对象模型的过程与定义任何对象模型相同 。首先,寻找所有对象共享的通用元素。持久化信息中有两个通用元素:惟一地标识持久化对象的方法(应该能够跨应用程序的各次执行 标识对象),以及关于对象实例的审计信息。图 1 说明如何用接口和基类定义这两个概念:

图 1. 通用的接口和基类

图 1 引入了 Identifiable 和 Auditable 接 口,这些接口定义的 API 用来标识对象实例和设置对象实例的审计信息。还引入了 BaseEntity 和 AuditableEntity 基类,可以根据是 否需要对象的审计信息,分别从这些基类派生出具体的持久化类。

通过用这些接口定义持久化对象,就可能创建出可以应用 于所有具体对象类型的抽象行为。这包括 UI 层(用来标识要执行创建、读取、更新和删除(CRUD)操作的对象)以及服务和数据层。本 文的代码示例(在 下载 中可以获得完整的代码包)演示如何使用这些接口帮助执行审计和减少数据访问对象(DAO)中的代码重复。

时间: 2024-10-23 18:59:44

持久化模式,第 1 部分: 现代 ORM 工具的策略和最佳实践的相关文章

持久化模式,第 2 部分: 提高代码重用和改进性能

简介 本系列包含两篇文章,第 1 部分 讨论了 Hibernate 和其他对象-关系映射(ORM)工具的几个基本最佳实践.通过使用通用基领域类 和接口.集中的审计和泛型数据访问对象(泛型 DAO),应用程序可以建立更紧凑且可维护的领域模型和持久化层. 通过应用 第 1 部分 中的概念,可以提供新的代码重用机会.在这个部分中,我们首先讨论如何使用 Hibernate 和多态性在领域模型 中集成行为.接下来,继续 第 1 部分 对泛型 DAO 的讨论.在应用程序中集成和使用泛型 DAO 之后,您可能

Python数据库ORM工具sqlalchemy的学习笔记

SQLAlchemy是python的一个数据库ORM工具,提供了强大的对象模型间的转换,可以满足绝大多数数据库操作的需求,并且支持多种数据库引擎(sqlite,mysql,postgres, mongodb等),在这里记录基本用法和学习笔记. 一.安装 通过pip安装 $ pip install SQLAlchemy  二.使用 首先是连接到数据库,SQLALchemy支持多个数据库引擎,不同的数据库引擎连接字符串不一样,常用的有 mysql://username:password@hostna

搜狗有自己的模式来摆脱地图纯粹的工具化属性

摘要: 算下来,搜狗地图在业内也有十余年的历史,但它选择了与高德完全不同的路径.如果说高德属于产业链全覆盖的话,那么搜狗地图则更专注出行,但即使如此,在移动互联时代,搜狗 算下来,搜狗地图在业内也有十余年的历史,但它选择了与高德完全不同的路径.如果说高德属于产业链全覆盖的话,那么搜狗地图则更专注出行,但即使如此,在移动互联时代,搜狗也有自己的模式来摆脱地图纯粹的工具化属性. 孔祥来告诉记者,"十年来,地图行业的上下游已经分得比较清楚了,有上游的数据供应商.有专门提供入网数据.有专门做垂直数据的,

自动化工具后起之秀Ansible的部署实践

本文讲的是自动化工具后起之秀Ansible的部署实践,从早期手动加脚本的部署方式,到后来自动化工具(chef, puppet, saltstack, ansible等)的出现,再到如今DevOps的盛行,企业应用部署正式进入平台部署阶段,CD(持续部署)已经成为企业对应用部署的标准需求,运维的交付也不再是以周或天为单位,而是以分钟为单位. 本文主要介绍自动化工具Ansible,及其在普元DevOps平台中的应用部署和日常应用部署中的实践. 本文目录: 一.如何选择合适的自动化工具? 二.Ansi

《配置管理最佳实践》——1.6 工具的选择

1.6 工具的选择 在实施任何一个源代码管理解决方案中,工具的选择都是一项非常重要的任务.选择一个源代码管理工具需要考虑众多的因素.针对这一主题,我会在这章只讨论最基本的方面,而在我们的网站上(www.cmbestpractices.com/tools)专门讲了一个工具的选择部分作为对本章的补充.这样一来,就可以保证内容的时效性,同时可以允许我的同事说出他们的观点,尽管很多时候这个题目都会变成激烈的宗教般的争论. 首先可以观察到的一个事实是,目前市场上有众多优秀的源代码管理工具.感谢厂商们开发了

Windows Azure提示、工具和编码最佳实践

在撰写这一系列文章的过程中,我总结出了很多最佳实践.在这篇文章中,我介绍了在保护您的 Windows Azure 应用程序时,需要考虑的更多事项. 下面是一些工具和编码提示与最佳实践: 在操作系统上运行 获取最新的安全补丁 尽量以部分信任模式运行 错误处理 如何实施重试逻辑 记录 Windows Azure 中的错误 Azure 存储的访问权限 Blob 的访问权限 存储连接字符串 门卫模式 旋转存储密钥 用于确保数据安全的加密服务 在操作系统上运行 获取最新的安全补丁 当使用 Visual S

IBM PureApplication System 中的模式采用最佳实践

简介 过去几年,我们见证了中间件操作执行方式上的一次真正变革的开始.首先是发布了 IBM WebSphere CloudBurst Appliance 版本,然后推出了 IBM Workload Deployer 和 IBM PureApplication System 的后续版本,引入了基于模式的部署方法,这些已帮助客户在 IBM 中间件的计划.部署和管理方式上实现了根本改变.我们亲眼看到,此方法已改变了系统操作形势,还对采用它的公司中的开发和操作之间的关系产生了重大影响.这些基于模式的方法与

《Greenplum5.0 最佳实践》 模式设计 (三)

模式设计 最佳实践 Greenplum 是基于大规模并行处理(MPP)和shared-nothing架构的分析型数据库.其不同于高度规范化的事务型SMP数据库. 使用非规范化数据库模式,例如具有大事实表和小维度的星型或者雪花模式,处理MPP分析型任务时,Greenplum数据库表现优异. 数据类型 (Data Types) 使用类型一致 在做关联操作的两个表,其两个关联字段的数据类型尽量保持一致.如果数据类型不一致,Greenplum 数据库必然后动态的转化一个字段的数据类型,这样就可以实现不同

《DevOps实战:VMware管理员运维方法、工具及最佳实践》——3.4 管理源代码

3.4 管理源代码 源代码管理(SCM,Source Code Management)是DevOps环境中必不可少的元素.想象一下:如果你要把基础设施转换为代码,重要的是有一种回顾任何更改.在新更改引入问题(例如,在最好的情况下是定期出现不稳定的情况,在最糟糕的情况下引起停机)时回到文件不同版本的手段.有些人可能认为"容易"的方法是建立文件的多个拷贝,每个都使用唯一的名称(Vagrantf?ile1.Vagrantf?ile2.Vagrantf?ile01012015等),但是接着当你