我们都知道Hibernate的类映射通常是用xml文件来保存的,那么类与类之间的关联也是也是通过xml来实现的。
hibernate的类跟类之间的映射关联通常分为:
1.一对多(多对一),
2多对多
3.一对一(用的最少)
**
一,一对多,多对一。
**
一对多说的是一张表中的一条记录对应另一张表中的多条记录,也就是说在多的一方有外键把它和另外一张表关联起来。而多对一说的是在一张表中的好多记录的字段都是链接到另一张表的一条记录。
举例:班级和学生:一个班级有多个学生(一对多),好多学生同一班级(多对一)
通过这个例子来实现,多对一,一对多,篇幅所限,只写关键性代码。
class Grade{
//班级类
private Integer gid;//班级ID
private String gname;//班级名字
private Set<Student>StuHashSet=new HashSet<Student>();
//集合用来存储学生,多个学生保存到一个集合
}
学生类 (多的一方)
class Student{
`private int pid; //学生编号
private String pname;//学生姓名`
private Grade grade; //引用的班级类
}
配置文件:
班级(Grade)xml配置中核心代码
<set name="StuHashSet" table="t_student">
<!--这里的table可以省略掉其实-->
<key column="GradeId"></key>
<!--这里的key指的是在学生表中的外键字段-->
<one-to-many class="Student">
<!--这里class指的是学生类型-->
</set>
学生(Student)xml配置核心参数
<many-to-one name="grade" column="gid" class="Grade">
<!--column指的是对应字段,就是在当前表中生成一个字段然后关联外键-->
一般来说一对多和多对一维护是在多的这一边进行维护,因为这样就减少了Update语句,效率会提高一些。
多对多
多对多映射指的是两张表都是多个,有多个属性,这时候要关联就得跟第三张表打交道。
举例:一个老师带几个学生,一个学生有几个老师。
那么实现就需要借助第三张表了。
那么我们定义一个教师类;
class Teacher{
private Integer tid; //教师ID
private String tname; //教师名字
private Set<Student> stuHashSet=new HashSet<Student>();
//这里是多个学生的集合
}
学生类
class student{
private Integer sid; //学生ID
private String sname;//学生名字
private Set<Teacher> teaSet=new HashSet<Teacher>();
//集合存放教师
}
多对多的映射文件:
多对多由于两边都是集合,所以配置很相似。
teacher的xml文件
<set name="stuHashSet" table="t_stu_teac">
<!--需要注意这里table是第三张表,不能省略-->
<key column="tea_id"></key>
<!--这里的key指向的是第三张表的外键,关联本表的主键-->
<many-to-many column="stu_id" class="Student">
<!--manytomany指的是第三张表中第二个外键,链接学生表的那个字段-->
</set>
Student的xml文件
<set name="teaHashSet" table="t_stu_teac">
<!--需要注意这里table是第三张表,不能省略-->
<key column="stu_id"></key>
<!--这里的key指向的是第三张表的外键,关联本表的主键-->
<many-to-many column="tea_id" class="Teacher">
<!--manytomany指的是第三张表中第二个外键,链接教师表的那个字段-->
</set>
千万注意要写同一张表,不然会报错
一对一的关联
一对一这个关联用的其实很少,一般来说的话就是关联一个唯一性的字段,
举例:一个人一个身份证号码一个身份证号码只属于一个人,
那么我们用这个例子来实现一对一的关联
class Person{
private Integer pid; //人的ID
private String pname; //人的名字
private Idcard idcard; //关联身份证
}
class Idcard{
//private Integer personid ; //这个是用做第二个方法的暂时不需要~
private String cardNum;//这里是身份证号码
private Person person;//关联另外一张表
}
实现一对一有两种方法:
1,在身份证表里设置一个外键关联到用户。
2.给身份证添加一个字段,使得他既是主键,又是外键。
先说第一种:
xml文件中配置关键代码:
Person表(没有外键)
<one-to-one name="idcard" class="IdCard"></one-to-one>
name是引用的那个变量,class是指关联的哪个类。
IdCard映射表
有外键的表,连接用户
<!---有外键的表需要使用many-to-one来映射->
<!---unique是唯一约束,cascade是指的级联->
<many-to-one name="person" class="person" unique="true" column="person_id" cascade="save-update"></many-to-one>
第二种方法:也就是既是主键也是外键,
那么我们Idcard里面的
private Integer personid 这一句就可以用了。
需要更改的地方其实也就是Idcard配置文件中。
<!-- 这里param是为了作为外键引用user类 -->
<param name="property">personr</param>
</generator>
</id>
然后下面的改为
<one-to-one name="user" class="Person" constrained="true" cascade="save-update"></one-to-one>
这样就可以了,
需要注意的是,赋值时要从身份证的那一边赋值,不然personid会成空值