实体关联映射:
1、一对一映射:
主要有两种方式来映射:
一、基于外键的映射方式:
首先有两张表,例如:TABEL user AND card;card 表中参照一个user的主键id
首先就是要保证这两个类中,必须要分别有各自的一个连接;也就是说在各个类中有另外一个类
的一个属性;比如说:
class User
{
private Card card;//card的一个属性
}
class Card
{
private User user;//user的一个属性
}
这个时候配置就是在user的配置文件中;
<one-to-one name="card" class="" cascade="save-update" property-ref="user"/>
注意这里的property-ref属性:它是指在映射中,user找到card是通过user这样一个属性来
找到的,如果不这样设置,那么就会在关联中出现user的id和card的id相关联的情况;
而在card的配置文件中;
<many-to-one name="user" class="" column="userid" unique="true">
注意这里column指如何找到user呢?是通过在表中的userid来找到的。而这里的unique指的
是限制为了一对一
二、基于主键的约束
这里仍然有两张表,这两张表分别是:user 和 card 而这个时候,在card表中,并没有userid
这一列,但是还是有一个参照userid的外键约束,这里的card中的id主要就是参照的是user中的id
而上面基本上没有什么改变。只是在配置文件中;
在user的配置文件中,
<one-to-one name="card" class="" cascade="save-update"/>
这里不需要配置property-ref属性
在card中
<one-to-one name="user" class="" constrainted="true"/>
另外在主键中也要改;开始的时
<id name="" type="">
<column name=""/>
<generator class="native"/>
</id>
这里应该改为:
<id name="" type="">
<column name=""/>
<generator class="foreign">
<param name="property">user</param>
</generator>
</id>
2、一对多、多对一、以及双向多对一关联关系;
首先讨论多对一的单向关联:这里有两张表;分别是email和user表;email为多的一方,而user为一
的一方,
email:id,emailname,uid;
user: uid, uname
有持久化类:User 和 Email
这里所谓单向就是说查询email表可以查出这个email是属于谁的,但是只查询user表不知道有多少个
email;
因此在持久化类中在多的一方,有一个一的一方的对象的属性;而在一的一方没有这方面的信息;
所以在配置的时候就只在多的一方(email)中配置
<many-to-one name="user" class="" column="uid"/>这样就够了;但是这个时候在持久化的时候需
要都调用save方法,这个时候还要加个级联属性:cascade=“all(save-update)”,那么这个时候
只需要持久化这个email对象就够了,而不需要持久化user了。同时还有一个属性就是:outer-join
;这个属性是指在查询的时候是否使用外连接;如果不使用,那么查询的时候就会查询两次;
另外,再讨论一下一对多的单向关联:
从一的一方看,这就是一对多的关系,表同上,只是在持久化中就有点区别了,这里在User中有个包
含set集合的属性,而在email中没有任何的设置,先前的user属性也不需要了,因为这是单向的影射
,所以不需要这样的设置。而在映射文件中就只在uses一方设计就好了。
<set name="emails" table="email">
<key column="uid"></key> //这里的key是在email表中参照user表的外键
<one-to-many class="Email"> //这里的class肯定是填的是many这一方的类名
</set>
最后再说一下多对一双向关联,只要把两边都加上,能让你找到我,让我找到你的话就可以了。
3、多对多关联(比较典型的就是权限设计的时候)
在做多对多关联映射的时候,都会有一张关联表;
第一、单向多对多
第二、双向多对多
单向多对多跟双向多对多本身没有多大的区别,只是必须有一边来维护他们之间的关系;
比如说:有两张表;user 和 power表
要建立它们的多对多的影射关系,那么这里必须在数据库中再建立一张表(连接表)user_power
那么在持久化类中设置一个属性--set。那么需要在映射文件中配置这个set的映射
<set name="" table="关联表名">
<key column=""></key>
<many-to-many class="" column="">
</set>
下面来解释一下中间属性的作用;
A: name:这里就是配置在所在持久化类中的set属性名
B:table:这里就是关联表名,因为它们的关系就是靠这张关联表来维护
C:column:这里设置的是在关联表中,与持久化类所在表的关联字段
D:class:这里的many端,也就是name所对应的类;
E:第二个col
JavaEE经典试题(八)Hibernate实体关联映射
最新推荐文章于 2022-09-15 20:12:01 发布