读书人

联系关系映射

发布时间: 2012-09-09 09:27:54 作者: rapoo

关联映射

三:关联映射

类与类之间最普遍的关系就是关联关系,关联映射的本质:将关联关系映射到数据库,所谓的关联关系是对象模型在内存中的一个或多个引用。

??1)多对一单向关联关系

? 例如,客户(Customer)和订单(Order)的关系,一个客户能发出多个订单,而一个订单只能属于一个客户。从OrderCustomer的关系是多对一关系,意味着每个Order对象都会引用一个Customer对象。

? 那么在Orderxml中要加入

? <many-to-one

??????? name="customer"

??????? column="CUSTOMER_ID"

??????? style="background: #ccffcc; margin: 0cm 0cm 0pt; text-align: left;">??????? not-null="true"

???? />

Order.hbm.xml<many-to-one>元素建立了CustomerORDERS表的外键CUSTOMER_ID之间的映射。

?

它包括如下属性。

? name:设定待映射的持久化类的属性名,此处为Order类的customer属性。

column:设定和持久化类的属性对应的表的外键,此处为ORDERS表的外键CUSTOMER_ID

? class:设定持久化类的属性的类型,此处设定customer属性为Customer类。

? notnull:如果为ture,表示customer属性不能为null,默认为false

?

映射原理:在多的一端加入一个外键指向一的一端,它维护的关系是多指向一

2)一对多的单向关联关系

? 例如,客户(Customer)和订单(Order)的关系,一个客户能发出多个订单,而一个订单只能属于一个客户。从CustomerOrder的关系是一对多关系,意味着每个Customer对象都会引用一个集合属性存放Order对象。

? 那么在Customerxml中要加入

? < set name=" orders" >?

? < key column = " CUSTOMER_ID " />?

? < one-to-many class = "com.fendou.domain.Order " />????????

? </ set >?

此时通过 < key column = " CUSTOMER_ID " /> 在多的一端(Order)添加了一个外键 CUSTOMER_ID 指向一的一端。在一的一端通过orders维护多的一端。

?

多对一及一对多关联映射的区别(单向):?

不管多对一还是一对多,都是在" " 的一端添加一个外键指向" " 的一端,只不过是多对一是在多的一端为其自己添外键,而一对多则是在一的一端为多的一端添加外主键。

?

?

?

3 一对一关联

例如,注册用户(User)和用户详细信息(Useronfo)的关系

A: 一对一以外键关联

? 以外键关联的概念:两个实体各自有不同的主键,但是一个实体有一个外键引用另一个实体的主键。例如: user id pk,name,passeword??? userinfo? id pk,uid fk,infor

User.hbm.xml

<one-to-one name="userinfo"?? style="background: #ccffcc; margin: 0cm 0cm 0pt; text-align: left;">Useronfo.hbm.xml

<many-to-one name="user"??/>

唯一的多对一,其实就便成了一对一了

?

B: 一对一以以主键关联

?? 关联的两个实体共享一个主键例, UserUseronfo共享一个主键id,并且两个表是一对一关系,那么如何让一个表引用另一个表生成的主键?我们可以用hibernate的主键生成策略foreign机制生成

我们 Useronfo 主键是根据Use来生成的所以User可以不用修改,我们只需修改Useronfo.hbm.xml

?

<hibernate-mapping>

<id name="id">?

<generator name="foreign">??

<param name="property">user</param>

</generator>

</id>

<one-to-one name=" user " constrained="true"></one-to-one>

Useronfoid主键上,使用foreign表示与外键共享主键,也就是与User实体共享主键,而constrained设定为true,表示约束Useronfo的主键必须与user中对应资料的主键相同。

4)多对多映射

?hibernate的多对多映射是通过一个中间表来实现的。中间表是纽带。多对多中。两个JAVA对象如何才能表示多对多?我们最容易想到的方式就是在各自的成员变量里面,都包含一个集合(Set),来包含N多个另外一个对象。

假设A,B两个类多对多:

A.hbm.xml中,有下面一项:

<set name="A中的Set<B>" table="A-B中间表名">

? ??????<key column="外键A"/>?

???? ????<many-to-many style="background: #ccffcc; margin: 0cm 0cm 0pt; text-align: left;"></set>

这里的"外键A"就是"中间表"中相对于AID,也就是说这个column是在"A-B中间表"中的某一个column ,对应的ID"A的表"中的ID

这里的"外键B",也是在 "A-B中间表"中的column,对应的ID就是"B的表"中的ID

?

一对一主键关联关系person—IdCard

主对象person 从对象idCard? ???idCard 的主键生成是foreign<generator class=”foreign”>

<param name=”property”>person</param></generator>? <one-to-one name=”person”></one-to-one>? personidCard的属性 名字不能乱给,另外如果没有主对象则就不能保存从对象

当查询主对象Person p=(Person) session.get(Person.class ,id)时并且查了两个对象只会出现一条语句,而查询从对象时

当查询两个对象时就会发出两条记录,当查询一个对象时只会发出一条语句来。

级联和关系维护

?

?

?

?