Java Hibernate深度探险

一)Hibernate意义

在一个真正的OOAD中,我们的设计首先是做UML建摸,最终将一个系统涉及所有对象(这个东西不是东西那么简单)用类图来体现一个完整的设计,我们最后可能得到这几种类:控制业务逻辑的类,保存业务数据的类module(bean类),辅助类或者更多(具体问题具体分析,但是将业务所需数据归结为一个类module更适合分层)。到数据库低层实现的时候,

为了获取数据或者存储数据,你不得不为此加上一个操作数据库的控制逻辑,到此,你完美的设计估计会为此付出巨大的努力,因为你看到的业务数据层是一个复杂的模块,即使从面向对象观点来看,我们UML类图中的,业务数据层只是一个数据模块。Hibernate已经帮我们解决了业务数据层这个本来十分复杂的模块的底层实现,现在,我们只要在外层裹上我们的代表数据的类即可。

二)对象模型与关系数据库模型差异

在写出我初探Hibernate的感受之前,我觉得写下这一节还是很有必要的。带着问题研究远远比带着好奇研究要意义深远得多。

问题领域:

关系型数据库是存储数据的最好选择,但是随着OO技术日益发展,在persisitent层上关系型数据库的设计体系与OO体系格格不入,可以想象,当满脑子充斥着OOAD的你想到怎么隔离满天飞的SQL语句时,那是多么痛苦的表情。无论你的业务层设计多么完美,在真正储存数据或者加载数据时,你面对的无非是一大堆封装好的数据,这些数据在JDBC中已经完全失去对象(这里的对象称之为业务对象或许更为确切)的意义,你整体的OOAD到此为止。为什么会造成这种情况呢?原因是对象模型与关系数据库模型根本设计体系之间的差别。

对象模型与关系数据库模型各自理论出发点是不同的:对象模型的理论体系可以简单归结为这两点:

1) 以对象看待世界。

2) 对象间关系(继承,关联,聚合,组合)维系着整体构成。

而关系数据库模型唯一出发点是有效储存数据,KEY是数据库的关键技术,关系在这里只是各个数据表的KEY之间的关联,这种关联我觉得应该称之为数据的关联,其表达的意义远远没有对象之间的关联那么深广。

那么,我现在最关心的问题是hibernate是怎么利用关系数据库的数据表KEY关联来表达对象之间的关系呢?

在进入正式研究Hbernate之前,我们可以思索一下问题的似乎简单与似乎十分复杂的矛盾。

我们设计的代表数据层的所有类必须完美的体现在数据表之中。可以这样总结:

class-àtable

class1—(关系)---class2------〉table1---(关系)-----table2

问题的解决似乎很简单,特别是对于javabean构架,更是简单(看起来简单而已!!!)。

想象一个简单的javabean类:

public class SimpleBean{
  protected int id;
  protected String name;
  public int getId(){
   return id;
  }
  public void setId(int id){
   this.id=id;
  }
  public String getName(){
   return name;
  }
  public void setName(String name){
   this,name=name;
  }
}

我们完全可以这样进行name映射:

className-àtableName
propertyNameàcolumnName

时间: 2024-09-21 19:06:02

Java Hibernate深度探险的相关文章

Java开源项目Hibernate深度探险

项目 一)Hibernate意义 在一个真正的OOAD中,我们的设计首先是做UML建摸,最终将一个系统涉及所有对象(这个东西不是东西那么简单)用类图来体现一个完整的设计,我们最后可能得到这几种类:控制业务逻辑的类,保存业务数据的类module(bean类),辅助类或者更多(具体问题具体分析,但是将业务所需数据归结为一个类module更适合分层).到数据库低层实现的时候, 为了获取数据或者存储数据,你不得不为此加上一个操作数据库的控制逻辑,到此,你完美的设计估计会为此付出巨大的努力,因为你看到的业

关于Java Hibernate 插入与更新同一张MySQL表不同字段,出现锁没被释放

问题描述 关于Java Hibernate 插入与更新同一张MySQL表不同字段,出现锁没被释放 关于Java Hibernate 插入与更新同一张MySQL表不同字段,出现锁没被释放,这个有可能是数据还没插入完或者插完了锁没有被释放,导致下一个更新操作不能执行,等待超时,这个情况出现在操作数据量大的时候!这个情况有哪几种解决方式? [http-bio-8080-exec-3] [SQLErrorCodesFactory.:126] SQLErrorCodes loaded: [DB2 Derb

java hibernate运行起动报错

问题描述 java hibernate运行起动报错 严重: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sess

proxool hibernate-Proxool+java+hibernate

问题描述 Proxool+java+hibernate java应用程序,使用Proxool连接池和hibernate,怎么把Proxool.xml放到指定的地方,比如项目下的conf目录,而不是一定要放在src源路劲下

Java Hibernate对象(瞬时态,持久态,脱管态)详解_java

Java Hibernate对象            由于最近学习Java Hibernate,这里对Java Hibernate对象的几种状态进行了资料整理,  有兴趣的朋友可以看下. 瞬时(transient):数据库中没有数据与之对应,超过作用域会被JVM垃圾回收器回收,一般是new出来且与session没有关联的对象. 持久(persistent):数据库中有数据与之对应,当前与session有关联,并且相关联的session没有关闭,事务没有提交: 持久对象状态发生改变,在事务提交时

Java Hibernate快速入门

其实Hibernate本身是个独立的框架,它不需要任何web server或application server的支持.然而,大多数的Hibernate入门介绍都加入了很多非Hibernate的东西,比如: Tomcat, Eclipse, Log4J,Struts, XDoclet, 甚至JBoss.这容易让人产生Hibernate复杂难懂的误解,特别是打击了初学者的积极性. 在这篇文章将不涉及Eclipse, log4j, Struts, Tomcat, XDoclet,和JBoss.本文的

Java Hibernate包作用详解

Hibernate一共包括了23个jar包,令人眼花缭乱.本文将详细讲解Hibernate每个jar包的作用,便于你在应用中根据自己的需要进行取舍. 下载Hibernate,例如2.0.3稳定版本,解压缩,可以看到一个hibernate2.jar和lib目录下有22个jar包: hibernate2.jar: Hibernate的库,没有什么可说的,必须使用的jar包 cglib-asm.jar: CGLIB库,Hibernate用它来实现PO字节码的动态生成,非常核心的库,必须使用的jar包

java对象 深度克隆(不实现Cloneable接口)和浅度克隆

为什么需要克隆: 在实际编程过程中,我们常常要遇到这种情况:有一个对象A,在某一时刻A中已经包含了一些有效值,此时可能会需要一个和A完全相同新对象B,并且此后对B任何改动都不会影响到A中的值,也就是说,A与B是两个独立的对象,但B的初始值是由A对象确定的.在Java语言中,用简单的赋值语句是不能满足这种需求的,要满足这种需求有很多途径.   克隆的实现方式 一.浅度克隆 对于要克隆的对象,对于其基本数据类型的属性,复制一份给新产生的对象,对于非基本数据类型的属性,仅仅复制一份引用给新产生的对象,

java Hibernate框架Session的保存、更新、删除和查询教程

session的save方法 使一个临时对象变为持久化对象.session的save方法完成以下操作:1.把customer对象加入到缓存中,使他变为持久化对象2.选用映射文件指定的标识符生成器为持久化对象分配唯一的OID.Customer.hbm.xml文件中id元素的子元素指定标识符生成器: <generator><id name="id" column="ID" >    <generator class="increm