数据库三种映射
一对一:一个人对应一个身份证号
一对多:一个老师对应多个学生
多对多:学生表和课程表
Hibernate 持久类的关联关系
员工和部门:多对一关系
员工类(多的一方增加一的一方的对象)中增加部门对象
部门类(少的一方增加多的一方的集合)中增加员工List
多的一方为集合,初始化到少的一方,少的一方中的配置文件中加节点
少的一方为对象,初始化到多的一方,多的一方中的配置文件中加节点<many-to-one>
一对多都可以双向
掌握一发Eclipse快捷键:ctrl+shift+x 转为大写、ctrl+shift+y 转为小写
配置 Emp 到 Dept 的多对一关联
Emp 持久化类
public class Emp implements Serializable {
……
private Dept dept; // 省略其他属性及getter、setter访问器
}
Emp.hbm.xml
<class name="cn.hibernatedemo.entity.Emp" table="`EMP`">
......
<!--
name 一的一方的对象名
class 对象所对应的全类名
column 数据库的外键列名
cascade 级联操作
-->
<many-to-one name="dept" class="com.cfn.entity.Dept" column="deptno" cascade="save-update"></many-to-one>o.entity.Dept" />
</class>
//一的一方
private Set<Street> set = new HashSet<Street>();
//多的一方不写外键 实体类
在<set>标签中配置cascade属性
Inverse:只能在集合<Set>标签中设置
设为:true 由many方控制
//比如说删除部门下面的所有员工
inverse属性指定了关联关系中的方向
inverse设置为false,则为主动方,由主动方负责维护关联关系,默认是false
inverse设置为true,不负责维护关联关系
1. 在建立两个对象的双向关联时,应该同时修改两个关联对象的相关属性
2. 建议inverse设置为true
Cascade:需要级联操作的地方,都可以配置该属性
cascade属性值 | 描 述 |
---|---|
none | (不级联)当Session操纵当前对象时,忽略其他关联的对象。它是cascade属性的默认值 |
save-update | (保存或者修改的时候)当通过Session的save()、update()及saveOrUpdate()方法来保存或更新当前对象时,级联保存所有关联的新建的瞬时状态的对象,并且级联更新所有关联的游离状态的对象 |
merge | (同上)当通过Session的merge()方法来保存或更新当前对象时,对其关联对象也执行merge()方法 |
delete | (删除时级联)当通过Session的delete()方法删除当前对象时,会级联删除所有关联的对象 |
all | (保存、删除、修改都级联)包含所有的级联行为 |
Fetch 抓取策略
fetch = “select” lazy = “false”
不采用延迟策略,不使用关联信息也会查询出来;
fetch = “select” lazy = “true”
采用延迟策略,不会查询出来关联信息,使用的时候才会查询
fetch = “join” lazy = “false” 产生关联查询
HQL的连接查询
连接类型 | HQL语法 |
---|---|
内连接 | inner join 或 join |
迫切内连接 | inner join fetch 或 join fetch |
左外连接 | left outer join 或 left join |
迫切左外连接 | left outer join fetch 或 left join fetch |
右外连接 | right outer join 或 right join |
左外链接 :from之后的先
右外链接:join之后的先
内连接:关联可以放到where语句中