原理:

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. js判断是对象还是集合

    /*============================================ 函数功能:对返回数据中的列表数据进行非空处理 ============================== ...

  2. 编程与算法中的端点问题(linspace(a, b, n),endpoint)

    左闭右开,[0, n) ⇒ [0, n-1],共 n 个元素: 1. 列表长与编号 列表(seq,也可以是数组等线性结构)的长度要比末尾元素的编号多 1,比如一个列表内含有 5 个元素,最后一个元素的 ...

  3. Linux就该这么学 20181003(第三章管道符)

    参考链接https://www.linuxprobe.com/ 输入输出重定向 标准输入重定向STDIN 文件描述符0 默认键盘输入 标准输出重定向STOUT 文件描述符1 默认输出到屏幕 错误输出重 ...

  4. Redis-3-string类型

    Redis-3-string类型 标签(空格分隔): redis set key value [ex 秒数] / [px 毫秒数] [nx] /[xx] mset key value key valu ...

  5. 【原创】关于class.forname

    连接数据库前都要调用一下class.forname("driverName");然后使用DriverMnager获取连接,这是为什么呢? 首先jdbc标准要求,每个驱动必须向Dri ...

  6. SpringBoot学习笔记(2)----配置文件取值

    今天介绍三种配置文件手动取值的方式: springboot配置文件信息保存在application.properties中,默认可以spring.开头的进行spring进行一些常用参数的配置,但是很多 ...

  7. HDU-1215 七夕节 数论 唯一分解定理 求约数之和

    题目链接:https://cn.vjudge.net/problem/HDU-1215 题意 中文题,自己去看吧,懒得写:) 思路 \[ Ans=\prod \sum p_i^j \] 唯一分解定理 ...

  8. HDU 6315 Naive Operations(线段树+复杂度均摊)

    发现每次区间加只能加1,最多全局加\(n\)次,这样的话,最后的答案是调和级数为\(nlogn\),我们每当答案加1的时候就单点加,最多加\(nlogn\)次,复杂度可以得当保证. 然后问题就是怎么判 ...

  9. Linux 磁盘管理及分区

    硬盘结构和基础知识  扇区(Sector)为最小的物理储存单位,每个扇区为512 bytes,将扇区组成一个圆就是磁道(track),不同磁盘的相同磁道组成磁柱(Cylinder),磁柱是分区(par ...

  10. ERROR in xxxx.js from UglifyJS——配置版本混杂版

    常规解决套路可以参考这篇:https://segmentfault.com/a/11... 我采用了上面的做法,依然没法解决.我采用的是vue-cli脚手架自动生成的项目结构: vue-cli版本 2 ...