首先要明确数据表中的字段和其对应模型中的属性并不是一一对应的。
多对一:Student 与 Klass 的对应关系
在Student模型对应student表,其中有一个(Klass klass)的私有属性。
需要在student.hbm.xml中配置由klass和相应字段的关系
<many-to-one name="klass" column="klass_id" />很多学生对应一个班级,属性是klass,对应的表字段klass_id
根据Hibernate的反射机制,可以知道klass属性的类别,然后查找到对应的映射文件。然后根据学生表里面的字段
klass_id和Klass类的对应表主键ID相等的实例,赋值到klass属性。klass_id就是一个外键(学生表中),就是告诉
学生表中和klass表中由klass_id这个外键确定关系。<many-to-one name="klass" column="klass_id" />后面实际
应该有Klass对应的一个属性和klass_id相等的属性,这里是默认缺省默认对应学生表字段和Klass表的主键相等。
如果不是主键和klass_id相等,应该这样配置:
<many-to-one name="klass" column="klass_id" property-ref="xxx" />xxx指的是klass表里面和学生表里klass_id
对应关联的字段(模型属性)。还有就是在其它的属性配置的时候,如果不写column,默认表的字段名和属性名是一样的。
一对多关系:Klass 与Student对应的关系(一般用到了再配置)
klass表中并没有一个字段表示其包含的学生,但是在模型Klass中却有一个属性private Set<Student> students;
模型和对应表的字段并不是一一对应的,这里只是告诉了其外键关系,然后根据这个关系把需要的东西赋值给我 们 模型的属性。
<set name="students">
<key column="klass_id"></key>指明外键字段,根据学生表里面klass_id查找klass_id与我的主键相等的
<one-to-many class ="Student"/>
</set>
一对一关系:
(主键关联关系)
主对象是班级其中有一个字段Teacher teacher,对应表中有一个字段teacher_id 。
<one-to-one name ="teacher" column="teacher_id" />过程和多对一的一样。
从对象是老师(根据需要在模型中添加字段,可以根据老师找到他负责的班级)。
<id name="id">
<generator class="foreign">
<param name="property">klass</pram>(这个应该指的是老师表里面的klass属性)
</generator>
</id>
<one-to-one name="klass" constrained="true"/>根据反射找到映射文件,根据id找到对应的班级。
外键关联关系
主对象
<one-to-one name="teacher" column="teacher_id" unique="true"/>
从对象(如果老师模型中有对应的属性Klass klass)
<one-to-one name="klass" property-ref="teacher"/>如果Klass中的teacher和我相等,这代表这个班级是我的。
多对多关系:
映射文件:
<set name="students" table="teacher_student">
<key column="teacher_id"/>//通过一个外键找老师对应的学生
<many-to-many class="Student" column="student_id"/>//通过teacher_student的外键student_id到学生表找到对应的学生
</set>