|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
自己的整个学习思路完全被老师的讲课思路所牵制,这样几节课听下来,恐怕自己的见解都应该是书里的知识点了,根本谈不上自身发现问题,分析问题,和解决问题能力的切实提高。 1、媒介
Hibernate和Spring是两个出名的开源框架,愈来愈普遍地使用于J2EE使用程序的开辟中。固然它们各自所针对的方针分歧,可是它们都有一个配合的特性:依附性映照。Spring注意于在把对象前往到客户之前,匡助选择出对象间的依附性,如许以来年夜年夜削减了客户真个编码事情。Hibernate则专注于在把完全的对象模子前往到客户之前,选择出对象模子形貌的依附性。当间接利用JDBC来把一个数据模子映照成一个对象模子时,我们一般必要编写大批的代码来制作一个对象模子。Hibernate能够匡助打消这类年夜部分的编码事情。
Hibernate2.x供应了基础的表到对象的映照,一般的联系关系映照(包含一对一,一对多和多对多干系),多态映照,等等。Hibernate3.x把这类手艺又促进了一层-经由过程利用划定规矩、过滤、子选择等等来增强映照的天真性-它们供应了优秀粒度的注释特征。
在本文中,我们将向你展现划定规矩的各类分歧特征是如何匡助完成模子转换的。在Hibernate3.x之前,划定规矩属性只能呈现在一个property元素中。固然你还能够如许做,可是,Hibernate3.x供应了一个划定规矩属性或元素(实在,在触及到划定规矩利用时,这二者是等价的),它能够使用在很多元素中,包含discriminator,many-to-one,one-to-one,element,many-to-many,map-key,map-key-many-to-many和property。这增强了对象-干系(O-R)映照的天真性,并因而同意对更庞大的数据模子的优秀粒度注释。
大抵上有两种场所下,必需利用划定规矩:
1.必要划定规矩盘算了局的场合。与元素discriminator,element,map-key,map-key-many-to-many及property等一同利用的划定规矩属于这一范例。
2.借助于划定规矩的匡助完成联合之目标。与元素many-to-one,one-to-one及many-to-many等一同利用的划定规矩属于这一范例。
2、范例1:获得一个划定规矩的盘算了局
(一)Discriminator
在实践的数据形式中,常常有效一个表来形貌别的一个表的情形。划定规矩有助于在O-R映照中完成天真的多态性。
在所示的例子中,共有两个表:Product和ProductRelease。每一个产物纪录都有一个ProductReleaseID,用于参照它响应的产物刊行纪录,包含产物刊行名、范例、刊行日期等。
在ProductRelease表中一个风趣的属性是SubProductAllowable,其值能够是0或1。值1意味着任何该产物的刊行都能够有响应的子产物,而值0意味着不同意有子产物。比方,一些产物由多种子产物设置而成,而一些产物只能是其本身。
显现了一个从该数据模子注释出来的对象模子。个中,嵌套接口界说了getSubProducts和setSubProducts办法。类NestedProduct扩大了基类Product并完成了嵌套接口。一条产物数据纪录是属于Product仍是属于NestedProduct依附于它响应的产物刊行纪录的SubProductAllowable的值。
.产物和产物刊行数据模子
.产物和产物刊行对象域模子
为了乐成完成这个模子转化,我们利用了一个Hibernate3.x映照,以下:
<hibernate-mapping>
<classname="Product"discriminator-value="0"lazy="false">
<idname="id"type="long"/>
<discriminatorformula="(selectpr.SubProductAllowablefromProductReleaseprwherepr.productReleaseID=
productReleaseID)"type="integer"/>
<subclassname="NestedProduct"discriminator-value="1"/>
</class>
</hibernate-mapping>
假如划定规矩表达式盘算了局是0-也就是说,不同意有响应的子产物-那末该对象将是类Product。假如了局是1,该对象将是一个NestedProduct。在表1和表2中,关于Product表中的第一个纪录(ProductID=10000001),初始化类将是一个NestedProduct,由于它经由过程SubProductAllowable=1参考援用一个ProductRelease纪录。关于Product表中的第二个纪录(ProductID=20000001),初始化类将是Product,由于它经由过程SubProductAllowable=0参考援用一个ProductRelease纪录。
S/NProductReleaseIDSubProductAllowable...1111...26010... 表格1.表ProductRelease中的纪录
S/NProductIDProductReleaseID...11000000111...220000001601... 表格2.表Product中的纪录
(二)Property
一个property元素中的划定规矩同意对象属性包括某个派生值,如sum,average,max等等的了局,就象上面如许:
<propertyname="averagePrice"formula="(selectavg(pc.price)fromPriceCataloguepc,SelectedItemssiwheresi.priceRefID=pc.priceID)"/>
别的,一个划定规矩,依据以后纪录的某些属性值,另有助于检索来自于另外一个表中的值。比方:
<propertyname="currencyName"formula="(selectcur.namefromcurrencycurwherecur.id=currencyID)"/>
这有助于从以后泉币表中检索一种泉币的称号。很分明,这些间接的映照能打消良多的编码转化成绩。
(三)map-key
划定规矩还同意map-key取任何大概的值。鄙人列例中(),我们想要使Role_roleID成为对象模子的map-key()。
.用户脚色数据形式
.用户脚色对象模子
在下面的数据形式中,User和Role经由过程一个称为User_has_Role的多对多的干系表被接洽在一同。为了获得一个已赋给一切脚色的用户,我们利用以下映照:
<hibernate-mapping>
<classname="User">
<idname="userID"/>
<mapname="roles"
table="UserRole"/>
<keycolumn="User_userID"/>
<map-key
formula="Role_RoleID"
type="string"/>
<many-to-many
column="Role_RoleID"
class="Role"/>
</map>
</class>
<classname="Role">
<idname="roleID"/>
</class>
</hibernate-mapping>
Role_RoleID用作多对多元素联合列列值。但是,Hibernate其实不同意Role_RoleID呈现在map-key和many-to-many的列属性中。可是借助于划定规矩,Role_RoleID也能够用于map-key。
(四)别的的情况:element,map-key-many-to-many以致更多
象property如许的元素,可以被赋于任何无效的划定规矩表达式的盘算值。
划定规矩与map-key-many-to-many一同利用的情况相似于map-key。但是,map-key-many-to-many常常使用在三重干系表达时,这时候一个mapkey本身就是一个参考对象,而不是一个参考属性。
但是,有些情形下其实不撑持划定规矩的利用。一些数据库(比方Oracle7)其实不撑持嵌进的select语句(比方,一个selectSQL语句嵌进在一个SQL语句的select部分),这时候是不撑持把划定规矩用于运算了局的。因而,你必要先反省是不是撑持嵌进式selectSQL语句。
既然Hibernate映照失掉的SQL语句要把划定规矩表达式作为它的select方针的一部分,充实懂得你的数据库的SQL语法本性将有助于丰厚你关于划定规矩的利用,固然它大概削弱代码的可移植性。
3、范例2:利用划定规矩完成团结
(一)多对一
在实际天下数据建模时,别的一个典范的场所是proprietary干系映照,这是一种分歧于基础的一对1、一对多和多对多的干系映照。中的例子申明了,一个公司大概有多个接洽人,但只要一个是缺省的接洽人。有多个接洽人的公司的情况就是一个典范的一对多干系。但是,为了辨认有缺省的接洽人,ContactPerson表利用了一个属性defaultFlag(这里1代表是,0代表不是)。
<P> 为把缺省的接洽人干系注释成对象模子(),我们利用以下的映照:
<hibernate-mapping>
<classname="Company"table="Company">
<idname="id"/>
<many-to-one
name="defaultContactPerson"
property-ref="defaultContactPerson">
<columnname="id"/>
<formula>1</formula>
</many-to-one>
</class>
<classname="Person">
<idname="id"/>
<propertiesname="defaultContactPerson">
<propertyname="companyID"/>
<propertyname="defaultFlag"/>
</properties>
</class>
</hibernate-mapping>
在下面,我们把companyID和defaultFlag加以组互助为一个属性元素,并定名为defaultContactPerson,它组成了Person表的一个独一键。Company类中的多对一元素与Person类中的defaultContactPerson属性元素相团结。了局,最初的SQL语句相似以下:
selectc.id,p.idfromCompanyc,Personpwherep.companyID=c.idandp.defaultFlag=1
(二)一对一
在Hibernate中,一对一次要用于两个表共享不异的primary键的情况。关于foreign键干系,我们一般利用多对一来取代。但是,借助于划定规矩,一对一也能经由过程一个foreign键把表连接起来。比方,下面的多对一实例能够经由过程一对一体例作以下映照:
<hibernate-mapping>
<classname="Company"table="Company">
<idname="id"/>
<one-to-onename="defaultContactPerson"
property-ref="defaultContactPerson">
<formula>id</formula>
<formula>1</formula>
</many-to-one>
</class>
<classname="Person">
<idname="id"/>
<propertiesname="defaultContactPerson">
<propertyname="companyID"/>
<propertyname="defaultFlag"/>
</properties>
</class>
</hibernate-mapping>
(三)别的:多对多
划定规矩可被用在一个多对多元素中来完成从干系表到实体表间的特别联合,只管这其实不常常必要。
4、小结
本文中的示例展现了利用划定规矩的年夜多半场合。当必要划定规矩盘算值时,划定规矩表达式将呈现在了局SQL的select语句中。当划定规矩作于团结时,它将呈现在了局SQL的where部分。并且,划定规矩表达式能利用任何本性化的SQL,只需方针数据库撑持它就行。我们的终极结论就是,天真使用划定规矩将年夜年夜匡助从数据模子到对象模子的具有优秀粒度映照的创建,而这不必要任何编码事情。
先谈谈我对java的一些认识。我选择java,是因为他语法简单,功能强大,从web,到桌面,到嵌入式,无所不能。但当我进一步了解了java后,感叹,java原来也有许多缺点。 |
|