1.。多对一
public class Department {
private int id;
private String name;
//getter和setter方法略
}
public class Employee {
private int id;
private String name;
private Department depart;
//getter和setter方法略
}
在xxx.hbm.xml配置:
Department.hbm.xml
<hibernate-mapping package="com.yinger.domain">
<class name="Department">
<id name="id">
<generator class="native" />
</id>
<property name="name"/>
</class>
</hibernate-mapping>
Employee.hbm.xml
<hibernate-mapping package="com.yinger.domain">
<class name="Employee">
<id name="id">
<generator class="native" />
</id> <property name="name"/>
<!-- 多对一映射 name是对应的属性名 column是对应的表的字段名[可以不指定] Hibernate 会自动的根据数据库中的
这个字段的值到属性对应的类对应的表里查找对象 -->
<many-to-one name="depart" column="depart_id"></many-to-one>
</class>
</hibernate-mapping>
2.一对多映射
在原有的 Department.java 中添加
属性 private Set<Employee> emps; 以及相应的get和set方法
删掉 Employee.hbm.xml 中的多对一映射
修改 Department.hbm.xml 添加
<!-- 一对多的映射,key属性一定要有,指定字段名,这个字段是“多”的那个表中的字段名 class属性是指set中的元素的类型 -->
<set name="emps">
<key column="depart_id" />
<one-to-many class="Employee"/>
</set>
3.一对一映射
两种映射方法:① 基于主键的 一对一
② 基于外键的 一对一
public class Person {
private int id;
private String name;
private IdCard idCard; //对象
//getter和setter方法略
}
public class IdCard {
private int id;
private Date life;
private Person person; //对象
//getter和setter方法略
}
添加 映射文件
如果是第一种,基于主键的一对一:此时 person表中id和id_card 表中的id一一对应
Person.hbm.xml
<hibernate-mapping package="com.yinger.domain">
<class name="Person">
<id name="id">
<generator class="native" />
</id>
<property name="name"/>
</class>
</hibernate-mapping>
IdCard.hbm.xml
hibernate-mapping package="com.yinger.domain">
<class name="IdCard" table="id_card">
<id name="id">
<generator class="foreign">
<param name="property">person</param>
</generator>
</id>
<property name="life" />
<one-to-one name="person" constrained="true"/>
</class>
</hibernate-mapping>
如果是第二种,基于外键的一对一:此时 id_card 表中的字段 person_id 与 person 表中的 id对应
Person.hbm.xml
<hibernate-mapping package="com.yinger.domain">
<class name="Person">
<id name="id">
<generator class="native" />
</id>
<property name="name"/>
</class>
</hibernate-mapping>
IdCard.hbm.xml
<hibernate-mapping package="com.yinger.domain">
<class name="IdCard" table="id_card">
<!-- 基于外键的一对一映射,加上了unique="true"约束,相当于就是一对一映射 首先假设多个idCard对应一个person,但是加上了unique约束之后就变成了一个idCard对应一个person -->
<id name="id">
<generator class="native" />
</id> <property name="life" />
<many-to-one name="person" column="person_id" unique="true">
</many-to-one> </class><
/hibernate-mapping>
使用原则:多数情况下都是使用set,需要保证顺序使用list,但是想用List而又不需要保证顺序使用bag
注意点:
① 定义成 Set,而不是 HashSet
② 原来是 HashSet,保存了之后就不再是 HashSet 了,强制转型时会报错的!
原因是Hibernate进行的封装,变成了 PersistentSet,实现了 Set 接口,但是和 HashSet 没有关系,不能转型!
关系级联的设置
cascade:关系级联的处理方式,默认是 none
多对多和多对一 一般不配置级联
一对一 一般是 delete(前提是主从对象是同生共死的关系)
一对多 一般是 save-update
delete 就是说,比如删除一个部门,那么就要删除这个部门的所有的员工,这个一般是不符合实际的
inverse :是否放弃维护关联关系
如果是true的话,当某个对象是持久对象时,如果和它关联的对象发生了改变,Hibernate是不会产生update语句来进行更新的,所以会产生错误
注意:如果是true的话,那么一对多中的“多”一定要被告知是对应哪个“一”,否则数据库中“一”的字段会出现 null!