hibernate注解配置与xml配置(二)

hibernate注解配置与xml配置(关系映射)

实体之间的映射关系

  • 一对一
  • 一对多(多对一)
  • 多对多

关系映射注解

一对一单向外键

@OneToOne(cascade=CascadeType.ALL) 指定级联关系

@JoinColumn(name=”pid”, unique=”true”)把被控类的主键写到主控类中

一对一双向外键

主控方的配置同一对一单向外键

被控方在主控方的引用上加上注解:@OneToOne(mappedBy=”card”)

双向关联,必须设置mappedBy属性。因为双向关联关系只能交给一方去控制,不可能在双方都设置外键保存关联关系,否则双方都无法保存。

多对一单向外键

多方持有一方的引用

@ManyToOne(cascade={CascadeType.ALL},fetch=FetchType.EAGER)

@JoinColumn(name=”cid(和一对多一样)”,referencedColumnName=”CID”)

@JoinColumn中的name为当前类的属性名,(多对一单向,由多方维护)所以,name为student中的cid,而ReferenceColumnName为引用表的列(多对一单向,所以为一方的引用列)即ClassRoom中的主键列

一对多单向外键

一方持有多方的集合,在集合上设置

@OneToMany(cascade={CascadeType.ALL},fetch=FetchType.LAZY,mappedBy=”xxx”)

@JoinColumn(name=”cid”)(一方的主键)

一对多的时候,一的内部是一个集合,为了减少数据库的压力,少加载数据所以用LAZY加载,反之,多对一的时候多方只加载一条数据,所以可以用EAGER加载

mappedBy:选择将维护权交给哪一方控制

多对多单向外键

学生和教师构成多对多的关联关系,其中一方持有另一方的集合对象(学生拥有教师的集合)

创建中间表

@ManyToMany

@JoinTable(

name=”teachers_students”,

joinColumns={@JoinColumn(name=”sid”)},

inverseJoinColumns={JoinColumn(name=”tid”)}

)

多对多双向外键

双方持有对方的集合对象,其中一方设置
@ManyToMany(mappedBy=”teachers”)

xml配置文件映射

一对多关系

在“一”方(例如:组织)需要在映射文件中添加<set…>元素,因为它包含多个“多”方的对象

1
2
3
4
<set name="java映射类中对应的属性" inverse="true" lazy="true">     
<key column="表中对应字段"/>
<one-to-many class="多方的类"/>
</set>

“多”方(例如:用户)隶属于一个“一”方对象,一般的格式如下:

1
<many-to-one name="java映射类中对应的属性" column="表中对应字段" class="类名" not-null="true" />

一对一关系

有一个用户的基本信息表(USER)和一个用户的密码表(PASSWD)就存在一对一的关系,一次为例

1
2
3
4
5
6
<!-- 其中主表(eg. 用户的基本信息表)的配置 -->    
<one-to-one name="主表对象中子表对象的属性名" class="子表对象的类名" cascade="save-update"/>
<one-to-one name="password" class="com.amigo.dao.pojo.Passwd" cascade="save-update"/>
<!-- 子表(eg. 用户的密码表)的配置 -->
<one-to-one name="子表对象中主表对象的属性名" class="主表对象的类名" constrained="true" />
<one-to-one name="user" class="com.amigo.dao.pojo.User " constrained="true" />

####多对多关系

在基于角色的权限系统中,用户和角色存在的关系就是典型的多对多关系,即一个用户可以具有多个角色,而一个角色又可以为多个用户所有

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1   <set name="java对象的属性名" table="表名" cascade="all" outer-join="false">       
2 <key column="表的对应字段"/>
3 <many-to-many class="另一个表的对象类" column="另一个表的字段"/>
4 </set>
5
6 <!-- t_user方 -->
7 <set name="roleSet" table="t_user" cascade="all" outer-join="false">
8 <key column="roleId"/>
9 <many-to-many class="com.amigo.dao.pojo.Role" column="roleId"/>
10 </set>
11
12 <!-- t_role方 -->
13 <set name="userSet" table="t_role" cascade="all" outer-join="false">
14 <key column="roleId"/>
15 <many-to-many class="com.amigo.dao.pojo.User" column="roleId"/>
16 </set>