服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

精通hibernate之映射继承关系二(图)


  把每个具体类映射到一张表是最简单的映射方式。如图14-2所示,在关系数据模型中只需定义companies、hourly_employees和salaried_employees表。为了叙述的方便,下文把hourly_employees表简称为he表,把salaried_employees表简称为se表。
  
  hourlyemployee类和he表对应,hourlyemployee类本身的rate属性,以及从employee类中继承的id属性和name属性,在he表中都有对应的字段。此外,hourlyemployee类继承了employee类与company类的关联关系,与此对应,在he表中定义了参照companies表的company_id外键。
  
  salariedemployee类和se表对应,salariedemployee类本身的salary属性,以及从employee类中继承的id属性和name属性,在se表中都有对应的字段。此外,salariedemployee类继承了employee类与company类的关联关系,与此对应,在se表中定义了参照companies表的company_id外键。
  
  company类、hourlyemployee类和salariedemployee类都有相应的映射文件,而employee类没有相应的映射文件。图14-3显示了持久化类、映射文件和数据库表之间的对应关系。
  
 精通hibernate之映射继承关系二(图)(图一)

  
图14-2 每个具体类对应一个表

  
精通hibernate之映射继承关系二(图)(图二)

  
图14-3 持久化类、映射文件和数据库表之间的对应关系

  
  如果employee类不是抽象类,即employee类本身也能被实例化,那么还需要为employee类创建对应的employees表,此时he表和se表的结构仍然和图14-2中所示的一样。这意味着在employees表、he表和se表中都定义了相同的name字段以及参照companies表的外键company_id。另外,还需为employee类创建单独的employee.hbm.xml文件。
  
  14.1.1 创建映射文件
  
  从company类到employee类是多态关联,但是由于关系数据模型没有描述employee类和它的两个子类的继承关系,因此无法映射company类的employees集合。例程14-1是company.hbm.xml文件的代码,该文件仅仅映射了company类的id和name属性。
  
  例程14-1 company.hbm.xml
  
  <hibernate-mapping >
  <class name="mypack.company" table="companies" >
  <id name="id" type="long" column="id">
  <generator class="increment"/>
  </id>
  
  <property name="name" type="string" column="name" />
  
  </class>
  </hibernate-mapping>
  
  hourlyemployee.hbm.xml文件用于把hourlyemployee类映射到he表,在这个映射文件中,除了需要映射hourlyemployee类本身的rate属性,还需要映射从employee类中继承的name属性,此外还要映射从employee类中继承的与company类的关联关系。例程14-2是hourlyemployee.hbm.xml文件的代码。
  
  例程14-2 hourlyemployee.hbm.xml
  
  <hibernate-mapping >
  <class name="mypack.hourlyemployee" table="hourly_employees">
  <id name="id" type="long" column="id">
  <generator class="increment"/>
  </id>
  
  <property name="name" type="string" column="name" />
  <property name="rate" column="rate" type="double" />
  
  <many-to-one
  name="company"
  column="company_id"
  class="mypack.company"
  />
  </class>
  </hibernate-mapping>
  salariedemployee.hbm.xml文件用于把salariedemployee类映射到se表,在这个映射文件中,除了需要映射salariedemployee类本身的salary属性,还需要映射从employee类中继承的name属性,此外还要映射从employee类中继承的与company类的关联关系。例程14-3是salariedemployee.hbm.xml文件的代码。
  
  例程14-3 salariedemployee.hbm.xml

扫描关注微信公众号