1.Hibernate关联关系
一对一的关联关系
1) 共享主键:两个对象联系紧密
子表:主键同时又是外键(是父表的主键)
父表
类 Person Idcard
关系属性 idCard person
映射文件中:
<class name="父表" table="xx">
<id name="xx" column="xxx">
<generator class="increment"/><!--主键由自己控制-->
</id>
..
<!--关系属性 四个要素
1.关系属性 name
2.关系属性的类对应的表 class
3.外键
4.级联
-->
<one-to-one name="关系属性" class="关系属性的全路径" cascade="all"></one-to-one>
</class>
<class name="子表" table="xxxx">
<id name="xx" column="xxxxx">
<generator class="foreign"><!--子表的主键不由自动控制-->
<param name="property">关系属性名</param>
</generator>
</id>
<!--constrained="true" 明确父子关系-->
<one-to-one name="xxx" class="xxxx" cascade="all" constrained="true"></one-to-one>
</class>
2)唯一外键:
子表:会添加一个外键列(父表的主键),通过配置文件加上唯一性约束
父表:
<class name="xxxx" table="父表">
<id name="xx" column="xxxx">
<generator class="increment"/>
</id>
...
<!--关系属性-->
<one-to-one name="xxx" class="xxxxx" cascade="save-update"
property-ref="关系属性"></one-to-one>
</class>
<class name="xxx" table="子表">
<id name="xx" column="xxxx">
<generator class="increment"/>
</id>
...
<!--关系属性 子表有外键,外键的本质就是多对一-->
<many-to-one unique="true" name="xxx" class="xxxx"
column="外键列" cascade="save-update" ></many-to-one>
</class>
在使用hibernate的API
1.传递性持久化:在对对象进行操作时会将与其关联的对象执行相关操作
2.hibernate操作的是内存当中的对象,不会直接操作数据库中的数据,在处理有关联关系
的对象时要先在内存中解除他们的关系。
一对多 1:*
Employee Dept 一个员工对应一个部门,一个部门对应多个员工
* 1
关系属性 Dept Set<Employee> emps=new HashSet<Employee>();
为什么要使用Set:
1.Set可以去重复
2.如果关系属性是一个集合,要使用set接口类型,而不能使用Hashset,也Hibernate 延迟加载有关系
对象之间的单向和双向关系由业务需求而定
建表
t_employee
普通的列 + 外键列 d_id
t_dept
普通的列
cascade='save-update' 删除时要解除关系
1.如果删除的当前对象能够从<class>标签中获得明确的外键信息
无须再内存中解除关系直接删除
2.如果删除的对象从<class>标签中不能获得明确的外键信息
必须现在内存中解除关系,再删除 注意 inverse="true"的配置会使<key标签失效>
一般为没有明确外键信息的对象提供解除关系的工具方法