最近对于hibernate的关系映射有点遗忘,今天回顾了下以前的学习。一点浅薄观点,有什么不足、错误大家可以在评论指正。
hibernate 表关联关系包括一对一 多对一 一对多 多对多。这种表关系就是对对象之间的关系进行代码明确。外键是这种关联在数据库物理层面上的体现。无论是什么关系,在数据库的物理表中就是一个外键,重要的是映射文件的配置。
一对一分为主键关联一对一 外键关联一对一。
1、基于主键的121(从表的主键为外键)
<!-- 这里配置person属性和idCard是一对一的关系 -->
<one-to-one name="idCard" cascade="all"/>
<!-- constrained="true"表明该121的主键是外键 -->
<one-to-one name="person" constrained="true" ></one-to-one>
2、基于外键的121
主表:person表
<!-- 这里配置person属性和idCard是一对一的关系 -->
<one-to-one name="idCard" />
从表:idcard表
<!-- 表明该121的主键是外键 -->
<!-- unique保证是121关系不会使many21关系 ,idnum列是数据库中生成的-->
<!-- 与person 对应的person 表是通过idnum 的值关联至idCard 表的 -->
<many-to-one name="person" column="idnum" unique="true"/>
3、一对多
主表dept表
<!-- 配置one2many关系 级联cascade="save-update"-->
<!-- 当删除部门时可以将和部门有关联的学生也删除,若是不开启级联会报错 -->
<set name="set" cascade="save-update">
<!-- 设置关系的字段(该字段在多端存在为外键)-->
<key column="dept_id" />
<one-to-many class="Student" />
</set>
从表 学生表
<!-- column="dept_id" 表示将来自动生成的表的外键名; name对应domain类的属性 -->
<!--开启级联可以在保存学生时,将关联的部门自动保存 -->
<many-to-one name="dept" column="dept_id" cascade="all"></many-to-one>
上述的一对多是双向的,dept是one2many 对于学生表来说就是 manytoone。
对于123还是321,谁在前面就是谁管理关系。例如在java代码中实现时:
若是部门管理学生(123)
dept.setStudents(Set<Studnet>studnets);将学生的信息设置到dept中去
若是学生管理部门就是
student.setDept(dept);
当然上述两种java实现的数据库数据都是一样的,但是sql语句可能会有所不同。在后续的管理(级联delete,update)可能会有影响。
对于单项123还是单向321在实际应用中意义都不如双向123.
4、many to many
many to many在管理中都会转变为两个双向ont2many来管理
另外关于单项one2many参看:http://blog.163.com/red_chenxi/blog/static/250272092009111922915283/