在这里主要讲两个我亲身体验到的例子与大家分享:
1.多对一
2.继承
这两个是在应用中最常见的地方:
1.多对一
何谓多对一,以我的例子为例,在大学里,一个学院里有很多专业,一个专业下有很多班级
专业的字段里会有学院的类型来标识它所在的学院,而学院里很少需要有专业的字段,若想查到学院里的专业,返回专业的List比把它放到学院里的Set变量更划算!所以在显示的应用中很少这样做,再有在学院的表里也不存在专业相关的描述,所以有画蛇添足之嫌。
所以呢,专业对于学院,就是多对一了,所谓的多对一也是从专业的角度来看的!但是当我们初始化这个对象,或者持久化这个对象的时候,能否带上它的学院属性呢?这个很关键,也很必要,这就需要附加的一个属性来完成了:
下面我们以学院专业为例子,来看看该怎么写这个配置文件:
public class Institute//学院
{
private Integer id;
private String institute;
//get & set
}
public class Department //专业
{
private Integer id;
private Institute institute;//学院属性
private String department;
//get & set
}
下面就是配置文件了:
<hibernate-mapping>
<class name="subject.model.Institute">
<id name="id">
<generator class="increment"/>
</id>
<property name="institute"/>
</class>
<class name="subject.model.Department">
<id name="id">
<generator class="increment" />
</id>
<property name="department" />
<many-to-one name="institute" class="subject.model.Institute"
column="instituteId" lazy="false"/>//多对一,lazy="false"来将依赖延迟设置为false
</class>
</hibernate-mapping>
所谓依赖延迟就是说,如果我们把他设置为true,那么我们得到的department中的该属性初始化为空,否则就有该属性了!
2.继承
在我的系统中,存在三种用户,管理员、学生、教师,他们都有综合的属性,也有个性的地方,具体的类介绍如下:
public abstract class User //父类用户
{
private Integer id;
private String user;
private String password;
private String name;
private String telphone;
//get & set
}
public class Student extends User//学生
{
private SchoolClass schoolClass;
private String sn;
}
public class Teacher extends User//教师
{
private String level;
private Boolean confirm;
}
public class Admin extends User//管理员
{
private String grade;
}
在数据库中我把三种角色的对象存放在一个表中,用一个字段来区分三种角色,在hibernate映射继承时属于一种情况,可以参照书中的介绍:
<hibernate-mapping>
<class name="subject.model.User" discriminator-value="not null"> //这里的not null很关键,没这个就会出现问题
<id name="id">
<generator class="increment" />
</id>
<discriminator column="type" type="character" />
<property name="user" />
<property name="password" />
<property name="name" />
<property name="telphone" />
<subclass name="subject.model.Admin" discriminator-value="a">//存储对象类型的标识符
<property name="grade" column="sn" />//对于每种对象的字段都放到数据库的一列里了
</subclass>
<subclass name="subject.model.Teacher" discriminator-value="t">
<property name="level" column="sn" />
<property name="confirm" column="about" />
</subclass>
<subclass name="subject.model.Student" discriminator-value="s">
<property name="sn" />
<many-to-one name="schoolClass" class="subject.model.SchoolClass"
column="about" lazy="false"/>
</subclass>
</class>
</hibernate-mapping>