Java Hibernate深度探险
副标题#e#
一)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
#p#副标题#e#
一个类实例就是table的一行。这个问题很简朴的获得办理。
再进一步,思量如下简朴的一对一类关联:
public class Class1{
public Class2 class2;
public Class2 getclass2()…
public void setClass2(Class2 class2)…
}
public class Class2{
public Class1 class1;
public Class1 getClass1()...
...
}
这种干系很显然是双向的,可以从class1中获得class2,反过来,也可以从class2中获得class1,那么浮现到数据表中呢?首先可以必定class1àtable1,class2àtable2;很显然,table1和table2都要相互增加多一列来生存对方的key。
这些简朴的干系在数据库表的关联中获得了很好的支持,可是稍微巨大一点的呢?
诸如以下一个类:
public class S {
ArrayList datas;
Public List getDatas()..
Public void setDatas(List datas)..
….
}
这里假如简朴用上面所阐明的propertyname-àColumnName显然不行以,这种集相助为bean属性我们该怎么在数据表中获得很好浮现呢?假如这些荟萃只是简朴的String 荟萃,它在数据库表内里是怎么表述的呢?假如这些荟萃是生存某些类实例的,好像可以转换为数据库表的一对多的干系?
#p#分页标题#e#
别的一方面,担任体系是怎么在数据块表内里获得浮现的呢?担任的干系怎么用数据库的关联干系表达呢?担任所涉及的动态类识别怎么在数据库中获得浮现呢?
再往深处想一想,对付一个操纵:
public class BookStore{
Set books;
Public Set getBoos()..
Public void setBooks(Set boos)…
Public void addBook(Book book)…
public class Book{
public BookStore bookStore;
public Parent getBookStore()..
..
}
在业务逻辑中,我们会这样写代码:
Book book=new Book();
.bookStore.addBooks(book);
上面两行代码便已经清楚地成立了child与parent之间的干系,相对来说,数据库中的数据也应该按照这几行代码成立发生数据并成立这种关联。此时内存中的数据怎么跟数据库中的数据一致呢?