代码改变世界

解析Hibernate中的持久化—ORM

2012-05-30 15:19  myjava2  阅读(264)  评论(0编辑  收藏  举报

           最近一直在学习Hibernate,首先说一下Hibernate出现的原因吧,Hibernate是因为MVC的分层体系结构的出现,即数据持久层(模型层)的出现,持久层是在MVC三层架构的基础上提出来的,在提出持久层之前,业务逻辑层在实现业务逻辑的同时,还需要访问数据库,这样就为业务逻辑的扩展怎家了难度,有了持久层,业务逻辑层只需要负责业务逻辑的实现,对数据的交给持久层,使每一段业务逻辑代码的目的都更明确,这样操作就更简单了。

       如下图:增加了持久层的MVC分层结构

    

       Hibernate作为一个中间件,很好的实现了持久层的功能,其中就是使用了ORM(对象到关系的映射),Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。

      

      何谓持久化持久(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的数据存储在关系型的数据库中,当然也可以存储在磁盘文件中、XML数据文件中等等。持久化顾名思义就是把缓存中的东西放到数据库中使之持久

       对于需要持久化的对象,它的生命周期分为三个状态:临时状态,持久化状态,游离状态.

       临时状态Transient:刚刚用new语句创建,没有被持久化,不处于session的缓存中.处于临时状态的java对象被称为临时对象.

       持久化状态Persistent:已经被持久化,加入到session的缓存中.处于持久化的java对象被称为持久化对象.

       游离状态Detached:已经被持久化,但不处于session的缓存中,处于游离状态的java对象被成为游离对象.

持久化对象的特征:

       .  位于一个session事例的缓存中,可以说持久化对象总是被一个session事例关联

       .  持久化对象和数据库中的相关记录对应

       .  Session在清理缓存时,会根据持久化对象的属性变化来同步更新数据库

       .  Sessionsave()方法把临时状态变为持久化状态.

       .  Sessionupdate() ,saveOrUpdate()lock()方法使游离状态变为持久化状态.

       ORM模式

       ORM是实现持久化的技术之一,ORM—Object-Relational Mapping对象到关系的映射,通过使用描述对象和数据库之间的元数据,将Java程序中的对象自动持久化到关系数据库中。

       对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而在数据库中,关系数据库无法直接表达多对多关联和继承关系。因此,ORM一般以中间件的形式存在,主要实现程序对象到关系数据库的映射,ORM中间件能在任何一个Java程序的业务逻辑层和数据库层之间充当桥梁。

       ORM的优点:

       1.提高了开发效率。由于ORM可以自动对实体对象与数据库中的表进行字段与属性的映射,所以实际操作中已经不再需要一个专用的、庞大的数据访问层。

       2.ORM提供了对数据库的映射能够像操作对象一样从数据库中获取数据,而不用直接进行SQL编码。

       ORM的缺点

       系统结构方面,采用ORM的系统一般都是多层系统,层次多了效率就会降低。

       2.性能方面,主要体现在对持久化对象的提取和对数据的加工处理上,采用ORM时,系统可能将全部数据提取到内存对象中,然后进行过滤和加工处理,这样会产生性能的问题。

       3.对象持久化方面,ORM一般会持久化所有的属性,这对有些应用是不希望发生的。

       常用的ORM中间件有HibernateIBatisApache OJB 等等

以上的持久化技术是Hibernate实现ORM模式,还有其他的实现持久化模式

        1.JDBC直接访问数据库

         JDBCJava DataBase Connectivity standard)是面向对象的应用程序接口,统一规定了关系数据库的标准接口,为各个数据库厂商提供标准接口,实现了数据库访问的方式是在业务方法中直接嵌入SQL语句,SQL语句是面向关系的,依赖于关系模型,所以JDBC方式有点是简单直接,特别是对于小型应用程序。

       2.主动域对象模式

       主动域对象是实体域对象的一种形式,封装了关系数据模型和数据访问的细节,也就是在J2EE架构中,EJB组件中的实体EJB---EJB本身管理持久化。这样在实体域中封装了数据访问细节,并采用了通过过程域对象负责业务逻辑操作,程序结构更加清晰、易读,提高了程序的灵活性。

        3.CMP模式

       CMP模式(ContainerManaged Persistent)即容器管理持久化,表示EJB容器封装了对象和关系的映射以及数据访问细节来管理试题EJB的持久化。

       CMPORM相似之处在于,两者都是提供对象-关系映射服务,都把对象持久化的任务从业务逻辑中分离出来,区别在于CMP负责持久化实体EJB组件,而ORM负责持久化基于JavaBean形式的实体域对象。

       4.JDO模式

       JDOjava Data Object)是Java对象持久化的新规范,是SUN公司制定的描述对象持久化含义的标准API,严格来说,JDO不是对象-关系映射接口,因为它支持把对象持久化到任意一种存储系统中,包括关系数据库、面向对象数据库、基于XML的数据库。