Hibernate基础(3)

来源:互联网 发布:linux卸载oracle11g 编辑:程序博客网 时间:2024/06/08 06:33
一、Hibernate进阶
1. 表与表之间的关系
1.一对多
(1)分类和商品
(2)客户和联系人
(3)一对多建表
通过外键建立关系:在多的一方创建字段作为外键,指向一方的主键
2. 多对多
(1) 订单和商品
(2)用户和角色
(3)多对多建表
创建第三张表维护关系:至少有两个字段作为外键,指向两个表的主键
3. 一对一
2. Hibernate一对多操作
以客户和联系人为例
1. 一对多映射配置
(1)创建实体类
(2) 让实体类之间相互表示
(a)在客户实体类里表示多个联系人
一个客户里有多个联系人
(b)在联系人实体类里表示所属客户
一个联系人只能属于一个客户
(3)配置映射关系
(a) 一个实体类对应一个映射文件
(b) 写映射的基本配置
(c) 在映射文件中配置一对多的关系
(a)在客户实体类里表示多个联系人
<set name="实体类中联系人的名称">
<key cloumn= ""></key>
<one-to-many class="联系人的实体类全路径"/>
</set>
(b)在联系人实体类里表示所属客户
<many-to-one name="客户的名称" class=“客户实体类的全路径” column="外键名称">

</many-to-one>
(d)创建核心配置文件,关联实体类配置文件
2. 一对多级联操作
(1) 级联保存
(1)添加一个客户,为这个客户添加多个联系人
(2)操作:
(a) 创建实体类的对象
(b) 相互关联实体类
(c) 保存到数据库
简单方法:
在映射文件中配置
<set name cascade="save-update">
(2) 级联删除
(1) 删除某一个客户,与客户关系的联系人都删除
(2) 操作:
(a) 在客户映射文件set标签,进行配置
<set name cascade="save-update,delete">
(b) 在代码中直接删除客户
根据ID查询对象,调用Session对象的delete方法
3. 一对多修改操作
先查询出数据,再修改持久态的数据
Hibernate默认双方都维护外键关系,影响性能,解决方法:
在“一”的一个放弃维护外键关系,使用inverse=true

3. Hibernate多对多操作
以用户和角色为例
1. 多对多映射配置
(1)创建实体类
(2) 让实体类之间相互表示
(a)用户里表示所有角色,使用Set集合
(b)一个角色有多个用户,使用Set集合
(3)配置映射关系
(a) 一个实体类对应一个映射文件
(b) 写映射的基本配置
用户:
<set name="角色集合名称" table="第三张表名称">
<key cloumn="当前映射文件在第三张表中的外键的名称">
</key>
<many-to-many class="角色实体类的全路径名" column="角色在第三张表中的外键的名称">
</many-to-many>
</set>
角色:
<set name="用户集合名称" table="第三张表名称">
<key cloumn="当前映射文件在第三张表中的外键的名称">
</key>
<many-to-many class="用户实体类的全路径名" column="用户在第三张表中的外键的名称">
</many-to-many>
</set>
(c) 配置多对多关系
(4)创建核心配置文件,关联实体类配置文件

2. 多对多级联保存
根据用户保存角色
(1)在用户映射文件中set标签进行配置,cascade=save-update
(2)代码:
(a)创建用户和角色对象
(b)将角色保存到用户中,再保存用户

3. 多对多级联删除
(1)在set标签中进行配置,cascade=delete
(2)删除用户
直接删除
4. 维护第三张表
用户和角色多对多关系,通过第三张表维护
(1)让某个用户有某个角色
(a)根据ID查询用户和角色
(b)把角色放到用户里
把角色对象放到用户Set集合中
(2)让某个用户没有某个角色
(a)根据ID查询用户和角色
(b)从用户里把角色去掉
从用户的Set集合中把角色去掉