首先,有三个实体对象User,Student, Teacher
其中三者共同的属性是name,password,fullname,均定义在User中,Student和Teacher继承User
用每个类分层的方式进行mapping映射,只需要用到一个表userinfo就可以描述以上关系
但需要增加一个user_type字段
<
class
table
="userinfo"
name
="cn.hxex.exam.model.User"
>
< id name ="id" column ="ID" >
< generator class ="uuid.hex" />
</ id >
< property name ="name" column ="NAME" />
< property name ="password" column ="PASSWORD" />
< property name ="fullname" column ="FULLNAME" />
< subclass name ="cn.hxex.exam.model.Student" discriminator-value ="student" >
< many-to-one column ="CLASS_ID" cascade ="save-update" name ="classes" />
< subclass >
< subclass name ="cn.hxex.exam.model.Teacher“ discriminator-value=" teacher" >
< set cascade ="all" lazy ="true" table ="TEACHER_CLASS" name ="classes" >
< key column ="TEACHER_ID" />
< many-to-many class ="cn.hxex.exam.model.Classes" column ="CLASS_ID" />
</ set >
< subclass >
</ class >
< id name ="id" column ="ID" >
< generator class ="uuid.hex" />
</ id >
< property name ="name" column ="NAME" />
< property name ="password" column ="PASSWORD" />
< property name ="fullname" column ="FULLNAME" />
< subclass name ="cn.hxex.exam.model.Student" discriminator-value ="student" >
< many-to-one column ="CLASS_ID" cascade ="save-update" name ="classes" />
< subclass >
< subclass name ="cn.hxex.exam.model.Teacher“ discriminator-value=" teacher" >
< set cascade ="all" lazy ="true" table ="TEACHER_CLASS" name ="classes" >
< key column ="TEACHER_ID" />
< many-to-many class ="cn.hxex.exam.model.Classes" column ="CLASS_ID" />
</ set >
< subclass >
</ class >
当执行from User 时候,只需要执行select * from userinfo ,可以减少sql执行次数
当执行from Student ,hibernate会自动执行select * from userinfo where user_type="student";
同样,在进行对象持久话操作时,也会根据对象类型自动设置user_type字段值