`
zhaosoft
  • 浏览: 186215 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Hibernate继承映射:每个子类一张表(joined-subclass)表结构

阅读更多

我在前面写了关于继承映射的整个继承树对应一张表的例子,但是他存在以一定的弊端。在数据表中会产生大量的null值。

为了避免这种情况的发生。我们可以这样去做:

<joined-subclass name="Skiller" table="skiller">
   <key column="emp_id"/>
   <property name="skill"></property>
 </joined-subclass>
 
 <joined-subclass name="Sales" table="sales">
   <key column="emp_id"/>
   <property name="sell"></property>
 </joined-subclass>

通过使用joined-subclass映射,对每一个子类生成一张表。

1、domain类:

package com.zhaosoft.domain;

public class Employee {

 private int id;
 private String name;
 private Department depart;

 public int getId() {
  return id;

 }

 public void setId(int id) {
  this.id = id;
 }

 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

 public Department getDepart() {
  return depart;
 }

 public void setDepart(Department depart) {
  this.depart = depart;
 }

}
2、各个子类:

package com.zhaosoft.domain;

public class Sales extends Employee{

 private int sell;//销售额

 public int getSell() {
  return sell;
 }

 public void setSell(int sell) {
  this.sell = sell;
 }
}

---------------------------------------------

package com.zhaosoft.domain;

public class Skiller extends Employee{
 private String skill;

 public String getSkill() {
  return skill;
 }

 public void setSkill(String skill) {
  this.skill = skill;
 }
}

 

3、映射文件:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
 "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.zhaosoft.domain">
     <!-- 当discriminator-value值为0时,为普通员工 -->
 <class name="Employee" discriminator-value="0">  
  <id name="id">
      <!-- 表示主键为自动增长 -->
   <generator class="native"/>
  </id>
 <property name="name" type="string"/>
 <many-to-one name="depart" class="Department" column="depart_id"></many-to-one>
 
 <joined-subclass name="Skiller" table="skiller">
   <key column="emp_id"/>
   <property name="skill"></property>
 </joined-subclass>
 
 <joined-subclass name="Sales" table="sales">
   <key column="emp_id"/>
   <property name="sell"></property>
 </joined-subclass>
 
 </class>
 
</hibernate-mapping>

 

4、测试文件:

public static void add() {
  Session s = null;
  Transaction t=null;
  try {
   s=HibernateUtil.getSession();
   t = s.beginTransaction();
   t.begin();
   Department d = new Department();
   d.setName("销售部");

   Employee employee1 = new Employee();
   employee1.setName("小三");
   employee1.setDepart(d);

   Skiller employee2 = new Skiller();
   employee2.setName("李斯");
   employee2.setSkill("skill");
   employee2.setDepart(d);
   
   Sales employee3 = new Sales();
   employee3.setName("王五");
   employee3.setSell(100);
   employee3.setDepart(d);

   Set<Employee> set=new HashSet<Employee>();
   set.add(employee1);
   set.add(employee2);
   set.add(employee3);
   d.setEmps(set);
   s.save(d);
   s.save(employee1);
   s.save(employee2);
   s.save(employee3);
   
   t.commit();
  } catch (Exception e) {

  } finally {
   if (s != null) {
    s.close();
   }
  }
 }

分享到:
评论

相关推荐

    Hibernate继承映射的第一种策略:每棵类继承树对应一张表

    总结来说,"每棵类继承树对应一张表"的继承映射策略在Hibernate中是通过添加类型标识字段来实现的,它适合继承层次浅且子类较少的场景。然而,根据实际项目需求和数据规模,可能需要权衡选择其他继承映射策略。对于...

    hibernate继承映射.rar

    在Java中,一个基类可以有多个子类,而在数据库中,这些子类可以共享一张表或者各自拥有独立的表,这取决于我们选择的继承策略。Hibernate提供了四种继承策略:单表继承、联合继承、表-per-hierarchy和表-per-class...

    Hibernate映射继承关系的三种方案.docx

    3) **Union-subclass映射**:这种映射方式每个类都对应一个表,子类和父类的公共属性在父类表中,子类特有的属性在子类表中,通过外键关联。这种方式最接近于面向对象的继承关系,数据库表结构与类的继承结构保持...

    hibernate的继承映射(InheritanceMapping)[文].pdf

    10.1.4. 混合使用“每个类分层结构一张表”和“每个子类一张表” 在某些情况下,开发者可以选择在继承层次的不同部分使用不同的映射策略,然后通过隐式多态来实现整个层次的多态性。但Hibernate不支持在同一阶级元素...

    Hibernate继承映射

    【Hibernate继承映射】是Java开发中使用Hibernate框架进行数据持久化时的一种重要技术,它允许我们将复杂的对象模型映射到数据库的表结构上。在实际项目中,我们经常遇到对象之间的继承关系,如抽象类和子类。...

    Hibernate教程17_继承映射

    在Hibernate中,继承映射主要有三种策略:单表继承(Single Table Inheritance)、联合继承( Joined Table Inheritance)和表格-per-类继承(Table per Concrete Class)。本教程可能主要关注的是单表继承,这也是...

    Hibernate数据关联映射与继承策略

    3. ** Joined Subclass Inheritance( Joined Table Inheritance)**:父类和子类各有一张表,子类的表只包含其特有的属性,通过外键关联到父类表。适用于子类有少量附加属性的情况,避免了冗余,但增加了查询复杂性...

    Hibernate3.1_学习源码

    配置文件:只配置父类的映射文件,在其中加入joined-subclass将两个子类实体映射关系添加 2) 数据库表:一张表,包括公共字段、特有字段、区分字段 实体层设计:与第一种方法设计一样,设计三个实体类,分父类和...

    hibernate 映射继承 demo

    联合继承策略为每个继承类创建一个单独的表,主类的信息存储在主表中,子类的特有属性存储在各自的子表中,通过外键关联。这种方式适合于类层级复杂、子类属性差异大的场景。 现在,我们开始创建一个简单的...

    Hibernate教程17_继承映射_补充2

    JOINED策略是Hibernate实现继承映射的一种方式,它将每个继承层次的类映射到单独的表中。 1. **继承映射的基础**: - Hibernate提供了四种继承映射策略:`SINGLE_TABLE`、`JOINED`、`TABLE_PER_CLASS` 和 `MAPPED_...

    Hibernate中文参考文档

    ### Hibernate中文参考文档知识点概述 #### 一、Hibernate简介与概念 **Hibernate** 是一个用于 Java 环境下的开源 **对象/关系映射 ... - **5.1.16 连接的子类 (joined-subclass)**:每种子类型一张表继承模式。

    继承映射的

    在“extendMapping”项目中,可以看到`&lt;joined-subclassname&gt;`元素的使用,它允许每个子类拥有自己的表,并通过外键关联到基类表,形成所谓的“join table per subclass”策略。这种方式不仅能够避免单个表过于臃肿...

    Hibernate笔记2

    - **定义**:为基类创建一张表,然后为每一个子类创建一张表。 - **示例**:在本例中,为`Car`类创建一张表,表名为`car`,用于存储所有`Car`实例的基本属性;为`Bus`类创建一张表,表名为`bus`,仅包含`Bus`特有...

    hibernate_reference中文文档.pdf

    - **9.1.3 每个子类一张表 (Table per subclass),使用辨别标志 (Discriminator)**:解释每个子类一张表并使用辨别标志的策略。 - **9.1.4 混合使用“每个类分层结构一张表”和“每个子类一张表”**:说明混合使用...

    hibernate 学习笔记4

    Hibernate 支持三种不同的多态映射策略:每个类一张表、每个具体类一张表以及单表继承。 ##### 每个类一张表 (Class Table Inheritance) - **适用场景**:当子类数量较少且每个子类具有大量特有的属性时。 - **表...

    (2)Hibernate3.2 中的类继承关系

    每个子类对应一个单独的数据库表,基类的信息则共享一个公共的表。这种策略可以避免单表继承中的空字段问题,但可能会导致更多的JOIN操作,影响性能。 3. Concrete Table Inheritance(具体类继承): 每个类...

    Hibernate 参考文档

    - **连接的子类(joined-subclass)**:多表继承的一种形式。 - **map,set,list,bag**:集合类型的映射。 - **引用(import)**:引入其他映射文件或类的快捷方式。 - **Hibernate的类型** - **实体(Entities...

    Hibernate Reference Documentation(Hibernate参考手册)

    - **joined-subclass**:联合子类映射。 - **map**、**set**、**list**、**bag**:集合类型的映射。 - **import**:引入其他映射文件。 ##### 4.2 Hibernate类型 - **实体与值**:实体类与值类型的区别。 - **基本...

Global site tag (gtag.js) - Google Analytics