Java Hibernate有很多值得学习的地方,这里我们主要介绍Hibernate意义和对象模型与关系数据库模型差异。
Java Hibernate仍是比较常用的,所以我研讨了一下目标模型与联系数据库模型差异 ,在这儿拿出来和咱们共享一下,期望对咱们有用
一Hibernate含义
在一个真实的OOAD中,咱们的规划首要是做UML建摸,最终将一个系统触及一切目标(这个东西不是东西那么简略)用类图来表现一个完好的规划,咱们***或许得到这几品种:操控业务逻辑的类,保存业务数据的类module(bean类),辅佐类或许更多(具体问题具体剖析,可是将业务所需数据归结为一个类module更适合分层)。到数据库低层完成的时分,
为了获取数据或许存储数据,你不得不为此加上一个操作数据库的操控逻辑,到此,你***的规划估量会为此支付巨大的尽力,由于你看到的业务数据层是一个杂乱的模块,即便从面向目标观念来看,咱们UML类图中的,业务数据层仅仅一个数据模块。Java Hibernate现已帮咱们处理了业务数据层这个原本十分杂乱的模块的底层完成,现在,咱们只需在外层裹上咱们的代表数据的类即可。
二目标模型与联系数据库模型差异
在写出我初探Java Hibernate的感触之前,我觉得写下这一节仍是很有必要的。带着问题研讨远远比带着猎奇研讨要含义深远得多。
问题范畴:
联系型数据库是存储数据的***挑选,可是跟着OO技能日益开展,在persisitent层上联系型数据库的规划系统与OO系统方枘圆凿,能够幻想,当满脑子充满着OOAD的你想到怎样阻隔满天飞的SQL句子时,那是多么苦楚的表情。不管你的业务层规划多么***,在真实贮存数据或许加载数据时,你面临的无非是一大堆封装好的数据,这些数据在JDBC中现已彻底失掉目标(这儿的目标称之为业务目标或许更为切当)的含义,你全体的OOAD到此为止。为什么会形成这种状况呢?原因是目标模型与联系数据库模型底子规划系统之间的不同。
目标模型与联系数据库模型各自理论起点是不同的:目标模型的理论系统能够简略归结为这两点:
1) 以目标看待国际。
2) 目标间联系(承继,相关,聚合,组合)维系着全体构成。
而联系数据库模型仅有起点是有用贮存数据,KEY是数据库的关键技能,联系在这儿仅仅各个数据表的KEY之间的相关,这种相关我觉得应该称之为数据的相关,其表达的含义远远没有目标之间的相关那么深广。
那么,我现在最关怀的问题是Hibernate是怎样使用联系数据库的数据表KEY相关来表达目标之间的联系呢?
在进入正式研讨Hbernate之前,咱们能够思索一下问题的好像简略与好像十分杂乱的对立。
咱们规划的代表数据层的一切类有必要***的表现在数据表之中。能够这样总结:
class-àtable
class1—(联系)---class2------〉table1---(联系)-----table2
问题的处理好像很简略,特别是关于Javabean构架,更是简略(看起来简略罢了!!!)。
幻想一个简略的javabean类:
- publicclassSimpleBean{
- protectedintid;
- protectedStringname;
- publicintgetId(){
- returnid;
- }
- publicvoidsetId(intid){
- this.id=id;
- }
- publicStringgetName(){
- returnname;
- }
- publicvoidsetName(Stringname){
- this,namename=name;
- }
- }
咱们彻底能够这样进行name映射:
- className-àtableName
- propertyNameàcolumnName
一个类实例便是table的一行。这个问题很简略的得到处理。再进一步,考虑如下简略的一对一类相关:
- publicclassClass1{
- publicClass2class2;
- publicClass2getclass2()…
- publicvoidsetClass2(Class2class2)…
- }
- publicclassClass2{
- publicClass1class1;
- publicClass1getClass1()...
- ...
- }
这种联系很明显是双向的,能够从class1中得到class2,反过来,也能够从class2中得到class1,那么表现到数据表中呢?首要能够必定class1àtable1,class2àtable2;很明显,table1和table2都要相互增加多一列来保存对方的key。
这些简略的联系在数据库表的相关中得到了很好的支撑,可是略微杂乱一点的呢?
比如以下一个类:
- publicclassS{
- ArrayListdatas;
- PublicListgetDatas()..
- PublicvoidsetDatas(Listdatas)..
- ….
- }
这儿假如简略用上面所剖析的propertyname-àColumnName明显不能够,这种调集作为bean特点咱们该怎样在数据表中得到很好表现呢?假如这些调集仅仅简略的String 调集,它在数据库表里边是怎样表述的呢?假如这些调集是保存某些类实例的,好像能够转换为数据库表的一对多的联系?
别的一方面,承继系统是怎样在数据块表里边得到表现的呢?承继的联系怎样用数据库的相相联系表达呢?承继所触及的动态类辨认怎样在数据库中得到表现呢?
再往深处想一想,关于一个操作:
- publicclassBookStore{
- Setbooks;
- PublicSetgetBoos()..
- PublicvoidsetBooks(Setboos)…
- PublicvoidaddBook(Bookbook)…
- publicclassBook{
- publicBookStorebookStore;
- publicParentgetBookStore()..
- ..
- }
在业务逻辑中,咱们会这样写代码:
- Bookbook=newBook();
- .bookStore.addBooks(book);
上面两行代码便现已清楚地树立了child与parent之间的联系,相对来说,数据库中的数据也应该依据这几行代码树立发生数据并树立这种相关。此刻内存中的数据怎样跟数据库中的数据共同呢?
【修改引荐】
- Hibernate入门学习宝典
- Hibernate特点简略剖析
- Struts-Spring-Hibernate事例
- Hibernate Sessin接口常用办法
- Hibernate业务全面介绍