一、概念
identity Map:通过在映射中保存每个已经加载的对象,确保每个对象只加载一次,当要访问对象的时候,通过映射来查找它们。其实在数据源架构模式之数据映射器代码中有提及到标识映射,Mapper类的getFromMap方法就是实现标识映射的实现。
二、为什么要使用标识映射?
//client代码 $venue = new venue(); $venue->setName("XXXXXXX"); //插入一条数据 $mapper = new VenueMapper(); $mapper->insert($venue); //获取刚插入的数据 $venueInfo = $mapper->find($venue->getId()); //修改数据 $venue->setName('OOOOOOOOOOO'); $mapper->update($venue);
$venue对象和$venueInfo对象是完全等同的,只是变量不同,在同一请求中,可能多次使用同一个对象。如果你修改了该对象的某个版本并保存到数据库中,如果确保该对象的另一个版本不会被你的修改所覆盖?不仅如此,重复的对象还可能导致系统性能降低。在一个进程中,一些常用的对象可能会被调用三四次,没必要每次都把对象重新保存到数据库中。标识映射可以很容易地解决这些问题。
三、实现标识映射
一个标识映射只是一个对象,它的任务就是跟踪系统中所有对象,并帮助系统避免将一个对象看成两个对象。
class ObjectWatcher { private $all = array(); private static $instance; private function __construct() { } static function instance() { if ( ! self::$instance ) { self::$instance = new ObjectWatcher(); } return self::$instance; } function globalKey( DomainObject $obj ) { $key = get_class( $obj ).".".$obj->getId(); return $key; } static function add( DomainObject $obj ) { $inst = self::instance(); $inst->all[$inst->globalKey( $obj )] = $obj; } static function exists( $classname, $id ) { $inst = self::instance(); $key = "$classname.$id"; if ( isset( $inst->all[$key] ) ) { return $inst->all[$key]; } return null; } }
在数据源架构模式之数据映射器中利用此映射
private function getFromMap( $id ) { return ObjectWatcher::exists( $this->targetClass(), $id ); }
说到这感觉是不是有点像注册表?
四、小结
如果在创建对象或添加对象到数据库时使用标识映射,系统中对象出现重复的可能性就变成了0.
当然,这只能对当前进程有效。不同进程间不可避免地会在同一时间访问同一个对象的不同版本。有时要考虑到并发访问可能会引起冲突导致数据损坏。如果问题严重,可能需要采用一定的“锁定”策略。也可以考虑将对象保存到共享内存中或者使用一个外部对象缓存系统,如memcached。
相关推荐
### 将对象映射到关系数据库详解 #### 一、引言 随着现代软件开发项目的不断演进,面向对象技术和关系数据库技术已成为行业的标准实践。然而,在这两种技术之间存在所谓的“阻抗失配”(impedance mismatch),即...
同时,也涉及了对象关系数据库系统(ORDBMS)相较于关系数据库系统的扩充之处。 首先,本章介绍了高级数据库应用的几个领域,包括计算机辅助设计(CAD)、计算机辅助软件工程(CASE)、多媒体系统、地理信息系统...
Java 持续性API(JPA)是Java EE 5和EJB 3.0规范的一部分,它的引入显著简化了企业级Java应用程序中的对象关系映射(ORM)过程。JPA允许开发者以声明式的方式定义Java对象如何映射到关系数据库的表,从而消除了对...
在对象关系映射(Object Relational Mapping,简称ORM)技术中,Hibernate作为Java领域内非常成熟且功能强大的框架之一,它允许开发者将Java类映射为数据库表,并管理Java应用中的对象关系持久化。其中,“关联映射...
Hibernate映射文件是Hibernate框架中用于定义对象-关系映射(ORM)的重要组成部分。它将Java类与数据库表之间的关系进行详细配置,使得程序能够透明地操作数据库。映射文件通常使用XML格式,并以`.hbm.xml`为扩展名...
对单个对象的重要行为进行建模:状态图 96 第九章 GRASP: 职责分配模式 97 导言 97 职责和方法 98 UML类图表示方法 98 职责和交互图 98 模式 99 GRASP: 职责分配中通用原则的模式 99 专家 99 问题: 99 解决方案: ...
面向对象数据库(OODB)是为解决关系数据库(RDB)在处理复杂对象行为时的局限性而发展起来的。RDB以其易理解、设计和建立的特点,长期以来在数据库领域占据主导地位。然而,随着科学和技术的进步,数据库的应用范围...
在Java持久化API (JPA) 和Hibernate框架中,注解是一种方便且强大的方式来配置对象关系映射(ORM),使Java对象与数据库中的表进行对应。以下是对标题和描述中涉及的Hibernate映射注解的详细解释: 1. **@Entity(name...
面向对象编程(Object-Oriented Programming,简称OOP)是一种重要的编程范式,其核心在于将现实世界中的对象及其属性和行为映射到软件系统中,从而使得程序更加直观、易于理解和维护。OOP的发展历程经历了几个关键...
面向对象编程的核心在于将问题域映射为一组对象,每个对象都有自己的状态和行为。在实际设计中,确定哪些数据和行为应该封装到一个对象中并非易事。例如,工厂模式提供了一种创建对象的框架,可以根据具体的条件返回...
NHibernate是一款.NET环境下的对象关系映射(ORM)框架,用于将.NET对象映射到数据库表上。通过NHibernate,开发者能够以面向对象的方式来操作数据库,从而简化数据持久化的代码量以及提高开发效率。 知识点一:对象...
它构建在Windows API之上,提供了一种面向对象的方式来处理Windows编程的底层细节。在这个压缩包中,你将找到一系列关于MFC核心概念和技术的文档,包括子类化、消息映射机制、对象模型以及常用的数据转换。 1. **...
Java持久化API(JPA)是Java平台上的一个规范,作为Java EE 5的一部分,它极大地简化了企业级应用中对象关系映射(ORM)的过程。JPA允许开发者以声明式的方式定义Java对象如何与关系数据库中的表进行映射,从而避免...
对象图是类图的实例,描述了一组对象及其相互关系。 - **B. 实例** - 错误。 - **C. 类模板** - 错误。 - **D. 对象图** - 正确。对象图是类图的一个实例。 **17. 状态图的组成** - **A. 状态图** - 正确。...
Smalltalk-80被视为最纯粹的面向对象语言之一,其设计理念对后来的众多面向对象语言如Object-C、C++、Self和Eiffel等产生了深远的影响。 随着时间的发展,面向对象编程不仅局限于编程实现,还逐渐扩展到了软件开发...
此章节介绍了 Hibernate 中的对象/关系映射的基础概念和技术。 - **5.1 映射定义 (Mapping declaration)** - **5.1.1 Doctype**:定义文档类型声明。 - **5.1.2 Hibernate-mapping**:描述 Hibernate-mapping ...
- 自动映射:ORM(对象关系映射)框架如Hibernate和MyBatis,可以自动处理对象和数据库之间的映射,简化开发过程。 6. **性能优化** - 索引策略:创建索引以加快查询速度,尤其在经常用于搜索的字段上。 - 缓存...
- **映射文件**:使用 Hibernate 映射文件(.hbm.xml 文件)定义 Java 对象和数据库表之间的关系。 - **Hibernate 配置**:设置 Hibernate 的配置文件(hibernate.cfg.xml),定义数据库连接、方言、缓存策略等。 - ...