将对象映射到关系数据库——对象/关系映射(O/R_Mapping)详解(终结篇)
ORMapping引擎

O/R Mapping 引擎1 概论O/R Mapping 引擎,即对象关系映射,它主要建立实体对象和关系数据库之间的联系2 优势●O/R Mapping 引擎比起传统的entitybean 去实现实体对象与关系数据库的映射要轻便灵活的多●在引擎的级别实现了对多语言,扩展表,继承(虚实两种模式)等的处理,这些,在一些流行的O/R Mapping软件中(如hibernate, jdo)一般是没有处理的,就算有,也不能很好的满足EAS开发的需求3 一些概念●继承:继承分为实继承和虚继承两类1.实继承实继承是指父类实体有自己对应的表,子类也有自己对应的表,相对于子类而言,数据存储在两张表中,即一个实体对应于两张表,存在同ID和不同ID两种情况2.虚继承虚继承是父类对象没有对应的表,是抽象实体。
只有子类有对应的表,即一个实体对应一张表●多语言多语言信息存放在solution中●扩展表:当用户定义一个实体时,字段太多不是很方便,或者有些字段他们希望定义在另外一张表中,这是定义的字段就是扩展字段4 主要功能及处理策略4.1新建(addnew)对外提供的方法如下public void addnew(IObjectPK pk, IObjectValue value)throws DataAccessExceptionpublic IObjectPK addnew(IObjectValue value)throws DataAccessException说明:第一个方法是新建一条制定主键的纪录第二个方法是新建一条记录,但是主键是由系统自动生成实现逻辑:1.查看有没有非抽象的父类,如果有递归调用create 方法2.新建纪录a)如果是自由属性,查找相应的字段及值b)如果是关联属性且为组合关系,递归调用create方法c)处理扩充表3.填充主键值Sequence图:4.2修改(update)对外提供的方法如下public void update(IObjectPK pk, IObjectValue value) throws DataAccessException说明:更新数据库中指定主键的纪录实现逻辑:1.查看有没有非抽象的父类,如果有递归调用update 方法2.由实体查找相应的修改字段a)如果是自由属性或单个关联的子对象,匹对相应的字段b)如果是关联属性为组合i.查找原来的字对象集合,按下面的策略处理新子对象有,旧子对象没有-- 新建新子对象没,旧子对象有-- 删除新子对象有,旧子对象没有-- 修改Sequence图:4.3删除(delete)对外提供的方法如下:public void delete(IObjectPK pk)throws DataAccessExceptionpublic void delete(IObjectPK[] arrayPK)throws DataAccessExceptionpublic IObjectPK[] delete(FilterInfo filter) throws DataAccessExceptionpublic IObjectPK[] delete(String oql)throws DataAccessException说明:实现逻辑:Sequence图:存在的问题:批量更新是假的批量操作,目前我们还没有提供批处理sql的引擎对(H/D)大对象的删除,对分录信息的删除是逐条删除,性能较差,可以将原来修改1+N问题的程序抽象出来,提供统一的方式,将1+N转为1+14.4查询(getCollection,getValue)public IObjectCollection getCollection()throws DataAccessExceptionpublic IObjectCollection getCollection(EntityViewInfo view) throws DataAccessExceptionpublic IObjectCollection getCollection(String oqlExpr) throws DataAccessExceptionpublic IObjectValue getValue(IObjectPK pk)throws DataAccessExceptionpublic IObjectValue getValue(IObjectPK pk,selectorItemCollection selector)throws DataAccessExceptionpublic IObjectValue getValue(String oql)throws DataAccessException说明:实现逻辑:一对一查询:一次查询,一句sql,将对一的那张表left join一对多查询:原来的引擎是逐条查询,现在的为了优化引擎,采用分层查询,几层就查询几次,也就是生成几句sql. 主要的思想是在查多端对象时,将一端对象left join并将对一端的查询条件翻转为多端的条件去过滤多端的信息以凭证这样的对象为例说明系统如何实现一对多的查询考虑这样的情景:一张凭证它有N个分录,N个分录中如果又都有M个辅助帐,如果我们沿用原来的逐条查询的引擎,会产生1+N+N*M条sql,性能非常低下,这就是所谓的I+N的问题,对这个问题的解决,目前在bos4.0.1这个版本上是用按层生成sql语句,有几层就有几句sql,,即1+1+1。
分层分包的缩写

在使用hibernate的时候我们会定义一些查询的方法,这些方法写在接口里,可以有不同的实现类.而这个接口就可以说是个DAO.
个人认为QO和DTO差不多.
----------------------------------------
DAO(data access object) 数据访问对象
是一个sun的一个标准j2ee设计模式,这个模式中有个接口就是DAO,它负持久层的操作。为业务层提供接口。此对象用于访问数据库。通常和PO结合使用,DAO中包含了各种数据库的操作方法。通过它的方法,结合PO对数据库进行相关的操作。夹在业务逻辑与数据库资源中间。配合VO, 提供数据库的CRUD操作...
VO:值对象、视图对象
PO:持久对象
QO:查询对象
DAO:数据访问对象
DTO:数据传输对象
----------------------------------------
struts 里的 ActionForm 就是个VO;
hibernate里的 实体bean就是个PO,也叫POJO;
QO,是把一些与持久性查询操作与语句放入。。
VO,V层中用到的基本元素与方法等放其中。如果要其调用BO,则要做BO转换VO,VO转换BO操作。VO的好处是其页面的元素属性多于BO,可起到很好的作用。。。。
-----------------------------------------
楼上的不对吧,PO是持久化对象。BO=business object—业务对象。
----------------------------------------------------
ORM是什么

SMYLE (http://www.drjava.de/smyle)
TopLink (/products/ias/toplink/index.html)
基本情况:公共仓库元模型(CWM)是对象管理组织(OMG)的一种和数据仓库相关的元模型标准,采用UML表示的对象层次结构,在保存到数据库中时由于面向对象的数据库技术的不完善(理论研究和商业应用都不是主流),所以该书的作者倾向于使用成熟的关系型数据库来保存-这也是存储本体时所遇到的问题。
二、对象-关系映射模式
从《公共仓库元模型:开发指南》一书第8章CWM元仓库中摘录出来的内容,实现了公共仓库元模型(CWM)的UML图到Microsoft SQL Server数据库的映射,是一种将对象层次结构映射成关系型结构的方法。个人认为可以作为将本体(Ontology)文件存储到关系型数据库中的一种可借鉴方法。
当你开发一个应用程序的时候(不使用O/R Mapping),你可能会写不少数据访问层的代码,用来从数据库保存,删除,读取对象信息,等等。你在DAL中写了很多的方法来读取对象数据,改变状态对象等等任务。而这些代码写起来总是重复的。
如果打开你最近的程序,看看DAL代码,你肯定会看到很多近似的通用的模式。我们以保存对象的方法为例,你传入一个对象,为SqlCommand对象添加SqlParameter,把所有属性和对象对应,设置SqlCommand的CommandText属性为存储过程,然后运行SqlCommand。对于每个对象都要重复的写这些代码。
2.1单值属性模式:是cardinality的上界为1的属性,映射到类所对应的表的列上。若其下界也为1(必须有的属性),列属性为NOT NULL。
软件系统数据库设计中的对象关系映射(OR Mapping)设计

由于对象之间的关系反映了具体的商业规则,因此将对 象映射到关系数据库时,必须保证对象之间的关系。
(2)在关系数据库中实现关联关系的基本思路 在关系数据库中主要是通过使用外键来实现关联关系。外 键允许将表中的某一行与其它表中的行相关联。 实现一对一或一对多关系,仅仅需要在表中加入另一个表 的主键
在ORMapping技术中不仅要解决对象在纵向方面的继承关 系需要被映射至数据库,对象之间在横向的的关联关系也需 要映射至数据库
(2)对象之间的关系总的可以分为
继承(Inheritance) 关联(association) 依赖(Dependency) 聚集(aggregation) 组合(composition)
8、将整个类层次映射为单个数据库表的示例
(1)该方法的优点:实现简单并且支持多态--对象角色发生变 化,或存在多重角色时;报表操作实现简单,因为表中包含 了所有信息。 详细内容请见文档 (2)该方法的缺点 中的说明 增加类层次中的耦合,类层次中任何类的属性的增加会导 致表的变更 如果在某个子类属性的修改错误会影响到整个层次结构, 而不仅仅是该子类;同时也会浪费了大量的数据库空间。
12、各种关联关系的实现示例—请见文档 (1)“1对1”关联关系
(2)“1对多”关联关系
(3)“多对多”关联关 系
本讲的简要回顾
1、子曰:“学而不思则罔,思而不学则殆。” “学而时习之”
2、子曰:“知之者不如好之者,好之者不如乐之者”
3、子曰:“三人行,必有我师焉”
4、子曰:“我非生而知之者,好古,敏以求之者也”
9、每个具体子类映射成单个数据库表
(1)优点:报表操作实现简单,因为 表中包含了具体子类的所有信息。 (2)缺点 类的修改会导致相对应的表及其 子类所对应表的更改 角色的更改会造成 ID 的重新赋值 (因为不同子类的ID可能重复) 难以在支持多重角色时,保持数 据的完整性
对象之间的关系及对象之间关系映射到数据库表数据的应用技术

(3)聚合(Aggregation)关系
1)聚合关系是比较弱的部分与整体(组合)之间的关系, 其中的聚合指的是整体与部分之间的包含关系。 2)其实聚合关系也是关联关系中的一种形式,是强的关联 关系。聚合关系体现了整体和部分之间的rson类中有一个hands的集 合,它存放被聚集的Hand对象:
(2)EJB中的CMP和BMP组件技术,但其主要的问题体现在 如下方面:
1)需要EJB容器,也就是J2EE应用服务器的支持; 2)在EJB中实现JDBC也比较复杂(比如需要应用BMP组件技 术)。
3、Hibernate框架所支持的O/R Mapping技术 (1)Hibernate框架技术的目标是希望成为Java平台中管 理持续化数据的一种完整的解决方案
(2)Hibernate框架是一种非强迫性的解决方案
也就是指在写业务逻辑与持续久类时,不会被要求遵循 许多Hibernate框架内特定的规则和设计模式,从而使得应用 系统的设计和开发实现受到一定的限制。
8、对象/关系映射(O/R Mapping) 映射的实现原理
(1)完成软件应用系统中上层面向 对象的数据模型与底层数据库的 关系模型之间的对应转换关系。 (2)利用这层转换关系,可以使应 用系统中的上层应用在开发实现时 不必关心对象模型在底层数据库的 存放以及底层数据库的各类维护工 作。
9、域实体对象和关系数据库表中的 数据映射规则
对象之间的关系及对象之间关系
映射到数据库表数据的应用技术
1、概念模型、域模型和数据模型 (1)系统模型是用来表示真实世界的实体
1)在科学和工程技术等领域中的模型是一个很有用途的概念, 它可以用来模拟一个真实的系统; 2)在软件系统的开发领域中的模型,则是表示真实世界的实 体。
面向对象程序设计中的对象关系映射技术

面向对象程序设计中的对象关系映射技术随着软件开发的不断发展,越来越多的应用程序需要通过数据库管理系统存储和处理数据。
而在面向对象的程序设计中,对象本身是一个抽象的概念,需要将其映射到数据库中。
这就需要用到对象关系映射(Object Relational Mapping, ORM)技术。
ORM技术是一种将面向对象的程序设计语言与关系型数据库(RDBMS)之间的数据转换技术。
ORM充分利用了关系数据库的满足ACID属性,事务处理及索引搜索等优点,为面向对象的程序设计提供了一个很好的数据存储和管理解决方案。
ORM的基本思想是将对象映射到数据库,使得对象和数据库的交互变得简单、易于维护和扩展。
ORM通过提供一个中间层,让开发人员可以使用类似于SQL的语言来操作数据,而将具体细节的处理交给ORM框架,如Hibernate、MyBatis等。
ORM技术的优点之一是可以消除程序中的连接池和连接代码,因为它自动为开发者处理数据库连接,在使用时只需调用ORM框架即可。
此外,ORM还可以从数据源读写数据,从而使应用程序能够充分利用数据库系统的能力。
使用ORM技术可以使程序设计变得更加简单。
开发人员只需要关注业务逻辑的实现,而不必处理数据库操作的复杂性。
ORM框架通常提供了良好的封装和缓存机制,可以极大地减少SQL编写和数据库操作的代码量。
此外,ORM还可以帮助开发人员自动处理数据库的约束和关联约束等。
然而,ORM技术也并非完美无缺。
一些开发人员会认为ORM框架可能引入更多的复杂性,如性能问题和安全问题。
在编写复杂业务逻辑时,面向对象的数据模型可能不适合关系型数据库,这可能导致ORM框架无法直接映射对象到数据表。
另外,ORM框架的学习曲线较陡峭,需要大量的学习和实践,以获得最佳的性能和安全性。
同时,ORM框架往往不支持所有的数据库,并且在维护框架所使用的结构和数据类型时,可能需要一些不必要的努力。
ORM技术的最佳实践建议是尽可能地保持简单并理解每个组件的作用。
什么是ORM
什么是ORM⼀、ORM简介ORM:对象关系映射(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping)⽤于实现⾯向对象编程语⾔⾥不同类型系统的数据之间的转换ORM是通过使⽤描述对象和数据库之间映射的元数据,将程序中的对象与关系数据库相互映射ORM可以解决数据库与程序间的异构性,⽐如:在Java中我们使⽤String表⽰字符串,⽽Oracle中可使⽤varchar2,MySQL中可使⽤varchar,SQLServer可使⽤nvarchar。
没有ORM时我们是这样完成对象与关系数据库之间的映射的: //将执⾏的sqlString sql = "SELECT name, id, age, password FROM users";//创建命令对象preparedStatement = connection.prepareStatement(sql);//执⾏并获得结果集resultSet = preparedStatement.executeQuery();//遍历结果集,将数据库中的数据转换成Java中的对象while(resultSet.next()){String name = resultSet.getString("name");int id = resultSet.getInt("id");int age = resultSet.getInt("age");String password = resultSet.getString("password");User entity= new User(name,id,age,password);Users.add(entity);}这种⽅案存在以下不⾜:1. 持久化层缺乏弹性。
⼀旦出现业务需求的变更,就必须修改持久化层的接⼝2. 持久化层同时与域模型与关系数据库模型绑定,不管域模型还是关系数据库模型发⽣变化,都要修改持久化曾的相关程序代码,增加了软件的维护难度。
将对象映射到关系数据库
________________________________________
满江红翻译团队:
-5-
图 3. 在一个类图里包含"shadow 信息"
我还没有讨论的一种 shadow 信息是用一个 boolean 类型的标志来表示当前一个 对象是否存在于数据库中。这里的问题是当你把数据保存到一个关系型数据中, 如果原先的对象是从数据库中获取出来的,你需要使用一个 SQL update 语句来 保存数据,否则应该使用 SQL insert 语句。一个普通的解决方法是为每个类实 现一个 isPersistent 的 boolean 型信号标志(图 3 里没有显示),当数据是从 数据库里面读取的时候把它的值设置成 true,如果对象是新创建的话则设置为 false。
最简单的映射就是把一个属性映射到一个字段。当双方拥有一样的基本类型的时 候,这甚至可以变得更简单。例如,双方都是 date 类型,或者属性是 string 类型而字段是 char 型,或者属性是 number 类型而字段是 float 类型。
映射术语
映射 (动词). 指的是如何把对象和对象之间的关系持久化到永久存储设备(这在里是关系 型数据库)中的行为。
将对象映射到关系数据库:对象/ 关系映射(O/R Mapping)详解
大多数现代商业应用开发项目使用面向对象技术,比如采用Java或者C#来创建应 用软件,同时使用关系型数据库来存储数据。但这并不是要说你没有其它选择, 也有许多应用程序是使用面向过程的语言开发,比如COBOL,而且也有许多系统 使用对象型数据库或者XML数据库来存储数据。然而,因为面向对象和关系数据 库技术到目前为止已经成为一种事实上的标准,在本章节中我假设你正在使用这 些技术。如果你采用其它的存储技术,本文里的许多概念仍然适用,只需要做一 点点修改(不必担心,Realistic XML总括了对象与XML映射的相关问题)。
数据和对象的映射关系
数据和对象的映射关系1.引言1.1 概述数据和对象的映射关系是计算机科学领域的一个重要概念。
在计算机编程和数据库管理中,数据和对象的映射关系指的是将数据转化为对象,或将对象转化为数据的过程。
这种映射关系的存在使得我们能够更加灵活地处理数据,并且方便地对其进行操作和管理。
在计算机编程中,数据是指程序使用的输入、输出或中间结果等信息,而对象则是指程序中的实体,具有数据和对数据进行操作的方法。
数据和对象的映射关系可以将数据表示为对象的属性,从而使得我们能够更好地理解和操作这些数据。
同时,在面向对象编程中,对象的定义可以帮助我们创建和管理多个实例,从而提高了代码的重用性和可维护性。
在数据库管理中,数据和对象的映射关系变得尤为重要。
数据库是一种专门用于存储和管理数据的软件系统。
在数据库系统中,数据被组织成了一种结构化的形式,可以通过对象的方式来进行操作和管理。
通过数据和对象的映射关系,我们可以更加方便地对数据库中的数据进行增删改查操作,并且可以更好地利用数据库的功能进行数据分析和数据挖掘。
总的来说,数据和对象的映射关系在计算机科学领域发挥着重要的作用。
通过将数据表示为对象的属性或通过对象的方式来操作数据,我们能够更加方便地处理和管理数据,提高程序的可维护性和代码的重用性。
在数据库管理中,数据和对象的映射关系使得我们能够更加便捷地对数据进行操作和分析。
因此,深入理解和掌握数据和对象的映射关系对于计算机科学的研究和应用具有重要意义。
1.2 文章结构文章结构部分的内容应包括以下信息:文章结构的目的是为了向读者介绍整篇文章的组织结构,使读者能够清楚地了解文章的各个部分以及它们之间的关系。
本文主要分为三个部分:引言、正文和结论。
引言部分包括三个小节:概述、文章结构和目的。
在概述部分,我们将介绍数据和对象的映射关系的背景和重要性。
在文章结构部分,我们将详细介绍整篇文章的结构和各个部分的内容。
在目的部分,我们将阐述本文的主要目的和意义。
odoo_对象关系映射_解释说明以及概述
odoo 对象关系映射解释说明以及概述1. 引言1.1 概述在当今的软件开发领域中,对象关系映射(ORM)是一种重要的概念和技术。
它将对象和数据库之间的映射关系进行了抽象和封装,使得开发人员可以通过操作对象来访问和操作数据库中的数据,而无需直接处理SQL语句。
此外,ORM 框架还提供了各种便捷的功能和特性,使得开发过程更加高效和可维护。
本文将重点介绍Odoo对象关系映射(ORM),它是一个流行且功能强大的业务应用开发框架。
我们将详细探讨Odoo ORM的基本概念、作用以及其在企业应用开发中的价值与应用场景。
1.2 文章结构本文按照以下结构展开论述:- 引言:介绍文章的主题和目标。
- 对象关系映射的基本概念:解释ORM的定义、重要性以及常见框架介绍。
- Odoo对象关系映射简介:对Odoo进行概述,并介绍其ORM模块以及对象模型的特点和优势。
- Odoo ORM核心功能解释说明:详细解释Odoo ORM的核心功能,包括数据表和类之间的映射关系、CRUD操作和查询接口,以及关联关系和约束规则管理。
- 结论:总结对象关系映射的作用,并探讨Odoo ORM在企业应用开发中的价值与应用场景。
通过以上结构,我们将逐步深入了解Odoo ORM并理解其在软件开发中的重要作用。
1.3 目的本文旨在提供对Odoo对象关系映射的详细说明和概述。
读者将能够了解到ORM的基本概念以及它在软件开发中的重要性。
此外,本文还将具体介绍Odoo ORM框架,并解释其核心功能和特点。
最后,通过结论部分,读者将能够理解对象关系映射在企业应用开发中的价值,并了解到如何在实际场景中应用Odoo ORM技术。
通过阅读本文,读者将获得对Odoo对象关系映射概念全面深入的认识,并能为自己在实践中运用该技术提供指导和依据。
2. 对象关系映射的基本概念:2.1 对象关系映射的定义:对象关系映射(Object-Relational Mapping,ORM)是一种将面向对象的编程语言与关系型数据库相结合的技术。