原理:

1.实现JavaBean的属性到数据库表的字段的映射:

       --通过配置文件将JavaBean的属性与数据库表的字段的关联起来

2.映射关系:

  一对多,多对一等

持久层(Persistence Layer):专注于实现数据持久化应用领域的某个特定系统的一个逻辑层面,将数据使用者和数据实体相关联。

数据持久化:数据持久化就是将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中数据模型的统称。数据模型可以是任何数据或对象模型,存储模型可以使关系模型、XML、二进制等

O/R M:

目的:利用面向对象的多台处理业务逻辑,而不是繁多的 if else

特征:

--关联以及与此相关的Lazy Load, O/R M是如何管理类之间的关联.当然这不仅于O/R M有关与设计者的设计水平也有很大关系.

--O/R M对继承关系的处理.

--O/R M对事务的支持.

--O/R M对查询的支持

内涵:

应用面向对象的思想,而不是纯粹的关注如何保存数据,将CRUD这些操作放入对象

对象关系映射:

          目的:面向对象与关系数据库不匹配的问题

          特征:描述对象和数据库之间的元数据

          本质:将数据从一种形式转换为另一种形式

             内涵:

                 业务实体:

                        --在内存中以对象的形式表现

                        --在数据库中以关系数据的形式表现

                        现象:对象具有继承、多态等特性,关系数据库是无法表达这些关系的

         

          在关系型数据库和业务实体对象之间作一个映射,这样,我们在具体的操作业务对象的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作对象一样操作它就可以了。

 

 

 

透明性:在计算机技术中,一种本来是存在的事物或属性,但从某个角度看似乎不存在,称为透明性现象

          例:qq之间的对话表面上看在qq与qq之间进行,实际上是qq与传输层进行

 

O/R映射层是持久层的一个特例,它的数据模型是对象模型(Object),存储模型是关系模型(Relational),cmp和Hibernate是对象模型到关系模型之间转换的两种不同实现。由于对象模型和关系模型应用广泛,所以很多人错误的认为数据持久层就是对象模型到关系型数据库的转换,其实持久化的范围更广一些。

 

案例1:

持久层(Persistence Logic):

    EJB:

       Entity Bean:包含持久层逻辑

             特征:

                ·BMP实现,还要实现相关的persistence logic

                 ·CMP有容器的支持,使得 persistence的实现不再需要用户

                  太费神

                ·查询数据库相关对象需要Entity中的home接口

                  自身的行为放到了XXXEntityManager

              缺点:

                 失去了面向对象的特征,变成了结构化的模型,类成了一个数据和函数的包装体

   

      dao模式:某种程度上解决了持久层逻辑的分离

特征:将dao从Entity Bean中分离了出来,没有破坏Bean的内部实现没有完全解决业务逻辑和持久层逻辑分离问题

 

      猜想:对象自身的属性的变化(业务逻辑影响),要体现到数据库中,怎样能避免在业务逻辑中操作持久层逻辑时能将对象的状态变化,体现到数据库中?

            --在完成一个业务逻辑后自动的检测到对象状态所发生的变化.随后在事务提交时,将发生的变化保存到数据库中

 

案例2:

Entity:实体(类似于j2ee中的Entity Bean)通常指一个承载数据的对象, 但是注意它也是可以有行为的! 只不过它的行为一般只操作自身的数据.

Domain Object:对象最重要的特性在于它拥有行为. 仅仅拥有数据,你可以称它为对象, 但是它却失去它最重要的灵魂.

需要和别的对象(不是Value Object)打交道的对象,我就不再称其为实体. 领域模型就是指由这些具有业务逻辑的对象构成的模型.

 

    POEAA:

       Table Gateway:以表为单位的实体集合,基本没有行为,只有CRUD操作.

       Row Gateway:以行为单位的实体,基本没有行为,只有CRUD操作.

       Active Record:以行为单位的实体,拥有一些基本的操作自身数据的行为(如上例中的GetName),同时包含有CRUD操作

                    Active Record中是充满了SQL语句的(不像orm的SQL透明), 所以有人想起来利用O/R m来实现"Active Record", 虽然在他们眼里看起来很方便, 其实根本就是返祖.

       Data Mapper:这才是真正的O/R m,Hibernate等等工具的目标.

 

案例3:

hibernate:

          重要特征:缓存机制

         

          基本特征:

              --Hibernate会监视对象的变化.所有的更新只要在事务提交的时候就会保存到数据库中(透明性)

              --将持久层逻辑从业务逻辑中分离

 

           实现Transparent persistence我认为是Hibernate最为成功的地方之一, 也是高层的O/R M应该起到的作用.动态生成SQL语句只是实现这一目的的手段之一, 不要把它作为O/R M的实质.

 

 

业务逻辑(Business Logic):

       1.从Persistence的角度Business Logic的分类:

                     涉及属性改动,需要反映到Persistence Layer的Business Logic (需要Facade的事务包装)

                  仅仅读取相关属性, 没有需要反映到持久层的Business Logic

 

 

       2.从Domain Object角度对Business Logic的分类:

                     由一个根(Root)Domain Object通过直接的属性关联实现的Business Logic(dependent object)

                     由多个独立的Domain Object通过Facade联系起来一起完成的Business Logic(session bean)

ORM原理的更多相关文章

  1. Hibernate的ORM原理和实现

    >>Hibernate和ORM ORM的全称是Object Relational Mapping,即对象关系映射.它的实现思想就是将关系数据库中表的数据映射成为对象,以对象的形式展现,这样 ...

  2. [Data Access] ORM 原理 (11): 效能議題

    這絕對是 ORM 的使用者,開發人員與 DBAs 共同想要問的議題,到底我使用了 ORM 和使用傳統的 ADO.NET 下 SQL 指令的方式會差多少? 這個問題不但會發生在 Entity Frame ...

  3. sqlx操作MySQL实战及其ORM原理

    sqlx是Golang中的一个知名三方库,其为Go标准库database/sql提供了一组扩展支持.使用它可以方便的在数据行与Golang的结构体.映射和切片之间进行转换,从这个角度可以说它是一个OR ...

  4. Mego(03) - ORM框架的新选择

    前言 从之前的两遍文章可以看出ORM的现状. Mego(01) - NET中主流ORM框架性能对比 Mego(02) - NET主流ORM框架分析 首先我们先谈下一个我们希望的ORM框架是什么样子的: ...

  5. java基础强化——深入理解java注解(附简单ORM功能实现)

    目录 1.什么是注解 2. 注解的结构以及如何在运行时读取注解 2.1 注解的组成 2.2 注解的类层级结构 2.3 如何在运行时获得注解信息 3.几种元注解介绍 3.1 @Retention 3.2 ...

  6. orm的设计思路

    一,我们先搞懂什么是orm? ORM:对象关系映射(Object Relational Mapping,简称ORM),目的是想像操作对象一样操作数据库.因为数据库不是面向对象的,所以需要编程进行映射. ...

  7. “造轮运动”之 ORM框架系列(三)~ 干货呈上

     这一趴里面,我就来正式介绍一下CoffeeSQL的干货.    首先要给CoffeeSQL来个定位:最开始就是由于本人想要了解ORM框架内部的原理,所以就四处搜寻有关的博客与学习资料,就是在那个夏天 ...

  8. 手撸ORM浅谈ORM框架之基础篇

    好奇害死猫 一直觉得ORM框架好用.功能强大集众多优点于一身,当然ORM并非完美无缺,任何事物优缺点并存!我曾一度认为以为使用了ORM框架根本不需要关注Sql语句如何执行的,更不用关心优化的问题!!! ...

  9. 手撸ORM浅谈ORM框架之Add篇

    快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...

随机推荐

  1. Swift 3.0 (二)

    一:函数 1.1无参数无返回值的简单函数 func sendMessage(){ let message = "Hey, Guys!" print(message) } sendM ...

  2. 修改input标签中的placeholder样式

    input::-webkit-input-placeholder { color: #fff !important; } input:-moz-placeholder { color: #fff !i ...

  3. 3ds Max制作妄想中的外星人形象

    来源:CG游 作者:FedericoScarbini 使用软件:3ds Max, Photoshop, ZBrush 简介 我认为每一个人都曾经在他的人生中的某些时刻妄想着关于外星人的事情;我猜这是很 ...

  4. 在远程X server上显示图形的设置方法

    1.在服务器的/etc/ssh/sshd_config中,设置X11Forwarding yes,然后重启ssh服务,cd /etc/init.d这个目录下执行 ./ssh restart 2.在客户 ...

  5. IDEA创建Maven项目显示一直加载中的问题

    使用IDEA这款工具创建Maven项目的时候出现过下面这种情况: 红色区域即maven骨架加载不出来... 或 loading loading loading ... 有时候需要很长一段时间才能加载出 ...

  6. PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql

    在一般的 Server 程序中都会有一些耗时的任务,比如:发送邮件.聊天服务器发送广播等.如果我们采用同步阻塞的防水去执行这些任务,那么这肯定会非常的慢. Swoole 的 TaskWorker 进程 ...

  7. win10 64位下VirtualBox安装CentOS6.9

    第一步:安装VritualBox 百度“VritualBox”下载安装即可: 第二步:下载Linux镜像系统并安装 这里写出我参照的博客,很详细,我就不累赘了! 原文地址:http://blog.cs ...

  8. spring中IOC的简单使用

    spring的ioc主要就是依赖注入,有基于构造器的依赖注入还有通过设值注入,这里我只简单的实现设值注入的方法,通过spring的依赖管理,我们可以很方便的了解各层之间的依赖关系,降低了各层之间的耦合 ...

  9. 洛谷 P1026 统计单词个数 (分组+子串预处理)(分组型dp再次总结)

    一看完这道题就知道是划分型dp 有两个点要注意 (1)怎么预处理子串. 表示以i为开头,结尾在j之前(含),有没有子串,有就1,没有就0 (2)dp的过程 这种分成k组最优的题目已经高度模板化了,我总 ...

  10. 【BZOJ 1296】 [SCOI2009]粉刷匠

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] f[i][j][k]表示第i行前j列刷了k次,最大满意度 f[][j][k]=max{f[i][l][k],f[i][l][k-1] ...