Hibernate配置文件的几个例子

在这里主要讲两个我亲身体验到的例子与大家分享:

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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值