`
kaka-pan
  • 浏览: 25624 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

hibernate映射继承关系

阅读更多
  在数据库设计中,会遇到继承关系的表的设计,一般来说有以下三种映射方法:(假设有HOURLY_EMPLOYEES和SALARIED_EMPLOYEES两个子类,父类EMPLOYEES)
   1.把每个子具体类都映射一张表,即只有 HourlyEmployee.hbm.xml和              SalariedEmployee.hbm.xml两个配置文件。
    好处:简单方便
   坏处:不支持多态查询
   
    例如,为了检索所有employee对象,必须分别检索所有的HourlyEmployee实例和 SalariedEmployee实例,然后把它们合并到同一个集合中。
   
   2.只为根类EMPLOYEES创建一张表,将公共属性和子类特有属性全部引入,并且加一个类型字段EMPLOYEE_TYPE,用于区分Employee的具体类型。
   好处:支持多态查询
   检索所有employee对象时,如果EMPLOYEE_TYPE字段取值为"HE",就创建        HoulyEmployee实例,如果EMPLOYEE_TYPE字段取值为"SE",就创建SalariedEmployee实例。
   坏处:配置文件相应变得复杂:如
 
   Employee.hbm.xml
  
  <hibernate-mapping >
  <class name="mypack.Employee" table="EMPLOYEES">
  <id name="id" type="long" column="ID">
  <generator class="increment"/>
  </id>
  <discriminator column="EMPLOYEE_TYPE" type="string" />
  <property name="name" type="string" column="NAME" />
  <subclass name="mypack.HourlyEmployee" discriminator-value="HE" >
  <property name="rate" column="RATE" type="double" />
  </subclass>
  
  <subclass name="mypack.SalariedEmployee" discriminator-value="SE" >
  <property name="salary" column="SALARY" type="double" />
  </subclass>
  
  </class>
  
  </hibernate-mapping>

  

   另外,如果公共属性和特有属性比较多时,字段会变得很多,表显得臃肿。
   
   3.为根类和子类都创建映射表,即需要创建EMPLOYEES、HOURLY_EMPLOYEES和SALARIED_EMPLOYEES表。EMPLOYEES表仅包含和Employee类的属性对应的字段(子类共有的属性),HOURLY_EMPLOYEES和SALARIED_EMPLOYEES表也仅包含其类中有的属性对应的字段(特有的属性),另外HOURLY_EMPLOYEES和SALARIED_EMPLOYEES表中都以EMPLOYEES表中的EMPLOYEE_ID字段(主键)作为主键  ,同时也作为外键。
     好处:同样支持多态查询,
    
Employee.hbm.xml
  
  <hibernate-mapping >
  
  <class name="mypack.Employee" table="EMPLOYEES">
  <id name="id" type="long" column="ID">
  <generator class="increment"/>
  </id>
  <property name="name" type="string" column="NAME" />
  
  <many-to-one
  name="company"
  column="COMPANY_ID"
  class="mypack.Company"
  />
  
  <joined-subclass name="mypack.HourlyEmployee"  table="HOURLY_EMPLOYEES" >
  <key column="EMPLOYEE_ID" />
  <property name="rate" column="RATE" type="double" />
  </joined-subclass>
  
  <joined-subclass name="mypack.SalariedEmployee" table="SALARIED_EMPLOYEES" >
  <key column="EMPLOYEE_ID" />
  <property name="salary" column="SALARY" type="double" />
  </joined-subclass>
  
  </class>
  </hibernate-mapping>


   通过左外连接获得子类对象的所有属性,如果HE表的EMPLOYEE_ID字段不为null,就创建HoulyEmployee实例,如果SE表的EMPLOYEE_ID字段不为null,就创建SalariedEmployee实例。
    当保存一个子类对象时,需要发出两条sql语句分别向子表和EMPLOYEES表中插入记录。(session的save()方法能判断实际引用的子类类型,从而插入记录到不同的子表)那么

  总的来说,具体怎么设计,还是要看情况....
0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics