`

15 继承(二)(每个子类扩展的属性单独保存在一张表中)

阅读更多


人类(Person)  , 男人(Men)继承"人"类, 女人(Women)继承"人"类,  UML如下:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

映射到三张表  , 每个子类扩展的属性单独保存在一张表中


t_person2表 :

1  int   id                //主键

2  varchar  name   //父类中的姓名

3  int   age            //父类中的年龄


t_men2表:

1 int person_id      //主键,外键

2  varchar a           //Men类扩展的属性a


t_women2表:

1 int person_id      //主键,外键

2  varchar  b          //Women类扩展的属性b



Person, Men, Women 三个类这里就不显示了,但简单, 想看了附件中有源码



Person.hbm.xml 如下:

<?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="extends_test.extends_2" auto-import="false">

	<class name="Person" table="t_person2" discriminator-value="0"><!-- "鉴别值"为0 -->
		<!-- 父类的属性 -->		
		<id name="id">
			<generator class="native"/>
		</id>		
		
		<!-- 父类的属性 -->
		<property name="name"/>
		<!-- 父类的属性 -->
		<property name="age"/>	
		
		<!-- Mem子类的映射 -->
		<joined-subclass name="Men" table="t_men2"><!-- table="t_men2"是表名 -->
			<!-- 外键的字段名-->
			<key column="person_id"></key>
			<!-- Men类专有的属性a -->
			<property name="a"/>
		</joined-subclass>		
		
		<!-- Women子类的映射 -->
		<joined-subclass name="Women" table="t_women2"><!-- table="t_men2"是表名 -->
			<!-- 外键的字段名-->
			<key column="person_id"></key>
			<!-- Men类专有的属性a -->
			<property name="b"/>
		</joined-subclass>	

	</class>	
</hibernate-mapping>
 

保存与查询操作:

 

package extends_test.extends_2;

import org.hibernate.Session;
import org.hibernate.Transaction;

import dao.HibernateUtil;

/**
 * 继承关系的映射(方法二)
 * 
 * 映射到三张表 , 每个子类扩展的属性单独保存在一张表中
 * 
 * 共分的部分(父类的属性)放一张表中
 * 
 */
public class Test
{

	/**
	 * @param args
	 */
	public static void main(final String[] args)
	{
		add();
		query();
	}

	/**
	 * 查询测试
	 */
	public static void query()
	{
		Session session = null;
		try
		{
			session = HibernateUtil.getSeesion();
			final Person p = (Person) session.get(Person.class, 2); //ID为2的记录是  Men类型
			System.out.println(p.getClass());
			//get()第一个参数用了 Person.class
			//能识别出是class extends_test.extends_1.Men类型

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

	/**
	 * 添加测试
	 */
	public static void add()
	{
		final Person p1 = new Person();
		p1.setName("我是Person类");

		final Men m1 = new Men();
		m1.setName("我是男人类");
		m1.setA("a");

		final Women w1 = new Women();
		w1.setName("我是女人类");
		w1.setB("b");
		Session session = null;
		try
		{
			session = HibernateUtil.getSeesion();
			final Transaction tx = session.beginTransaction();
			session.save(p1);
			session.save(m1);
			session.save(w1);
			tx.commit();

			//SQL如下 
			//Hibernate: insert into t_person2 (name, age) values (?, ?)
			//Hibernate: insert into t_person2 (name, age) values (?, ?)
			//Hibernate: insert into t_men2 (a, person_id) values (?, ?)
			//Hibernate: insert into t_person2 (name, age) values (?, ?)
			//Hibernate: insert into t_women2 (b, person_id) values (?, ?)
			//Hibernate: select person0_.id as id9_0_, person0_.name as name9_0_, person0_.age as age9_0_, person0_1_.a as a10_0_, person0_2_.b as b11_0_, case when person0_1_.person_id is not null then 1 when person0_2_.person_id is not null then 2 when person0_.id is not null then 0 end as clazz_0_ from t_person2 person0_ left outer join t_men2 person0_1_ on person0_.id=person0_1_.person_id left outer join t_women2 person0_2_ on person0_.id=person0_2_.person_id where person0_.id=?
			//class extends_test.extends_2.Men

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    Mybatis表对象继承实现

    3. 第三种方式将基类作为一张表进行存储,每个子类特性的属性都新建一张表进行保存,然后在基类对应的表里面通过一个字段来区分对象的类型。这种方式在数据表结构上区分得更加清晰,减少了数据冗余,同时也易于管理...

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

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

    jpa/hibernate继承注解

    在联合表继承中,每个子类都有自己的独立表,同时还有一个公共的父类表。使用`@Inheritance(strategy = InheritanceType.JOINED)`来声明此策略。子类属性被存储在其各自的表中,而共享的属性则在父类表中。子类与...

    VB6中单类模块子类化类,不需要再在标准模块中写消息处理过程了,作者PctGL

    传统的VB6子类化通常会在一个单独的标准模块中为所有子类化的对象定义`WndProc`函数,然后在每个子类中调用它,而PctGL的方法消除了这种需求。 `TestSubClass.vbp`是VB6工程文件,包含了项目的基本信息和引用。`...

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

    1) **Subclass映射**:这是最简单的一种方式,每个子类都映射到一个单独的表。这种方式下,Hibernate不会在数据库中体现继承关系,而是为每个类创建一个独立的表。这种方式适用于子类有很多特定的属性,而父类属性较...

    JPA 实现继承关系

    每个子类都有自己的数据库表,而父类的共享属性则存储在一个公共的表中。子类的表通过外键关联到父类的表。父类使用`@Inheritance(strategy = InheritanceType.JOINED)`注解,而子类则没有特定的注解。 3. **表...

    Hibernate继承映射(annotation)

    2. **类表继承(Class Table Inheritance)**:每个子类对应一个单独的表,父类的信息则被包含在每个子类表中。 3. **表泛型(Table per Concrete Class)**:每个具体类对应一个表,不存储抽象类信息,只存储其实例...

    示例-用类的继承计算球圆柱圆锥的表面积体积

    然后,我们为每个特定形状(球体、圆柱体和圆锥体)创建单独的类,这些类继承自`几何体`类,并覆盖或扩展基类的方法以实现各自特有计算规则。 对于球体,我们知道它的表面积公式是4πr²,体积公式是(4/3)πr³。在...

    Hib继承关系的映射

    - **每个具体子类映射成单个数据库表(不包括抽象基类)**:每个具体类(如 `Student` 和 `Professor`)都有自己的表,而抽象基类 `Person` 不映射。这种方式的优点在于报表操作简单,因为所有信息都在单独的表中。...

    java基于struts+Hibernate的物流车辆调度系统外文文献翻译.doc

    联合继承则是为每个子类创建单独的表,同时有一个共享的主表来存储共有的属性。这种方式适用于子类较多,且需要独立管理各个子类的情况。 表-per-hierarchy策略将所有子类的属性都存储在一个表中,通过一个额外的...

    数据库设计,讲解业务实体对象到数据库表的映射关系。

    - **表继承策略**:为超类和每个子类创建单独的表,超类表中的主键作为所有子类表的外键。 - **映射关联关系**:根据关联关系的类型(一对一、一对多、多对多),确定关联表的结构和外键的位置。 - **一对一**:...

    Android学习之路——5.Activity子类

    4. **易于测试**:子类化可以使测试更加有针对性,我们可以为每个子类编写独立的测试用例。 在实际开发中,我们经常遇到需要多个Activity共享某些功能的情况。这时,可以创建一个基类,将这些共通的代码抽象到基类...

    Hibernate之实体层次设计

    前者为每个子类创建一个单独的表,后者则将所有子类的属性都包含在一个公共表中,而子类特有的属性会存储在附加的表中。`TablePerSubclassTest.java`可能包含了对这两种情况的示例,我们将看到如何使用@Inheritance...

    hibernate 映射继承 demo

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

    完整版Java全套入门培训课件 Java基础 04-继承上(共8页).pptx

    Java中的继承是面向对象编程的重要特性,它允许子类继承父类的属性和方法,从而实现代码的复用和类的扩展。在本课程中,我们深入探讨了继承的几个关键概念。 首先,继承的概述指出,当多个类具有相似的属性和行为时...

    将对象映射到关系数据库详解

    1. **整个层次结构映射到一张表**:这种方法适用于层次结构简单且每个子类的属性变化较小的情况。所有类的数据都存储在同一张表中,通过一个额外的字段标识不同类的实例。 2. **每个具体类映射到单独的一张表**:...

    bams.rar_BAMS

    2. **类表继承(Class Table Inheritance, CTI)**:每个子类都有自己的独立表,父类信息在每个子类表中重复。这样可以避免表结构过于复杂,但增加了数据冗余。 在BAMS项目中,可能是通过某种方式实现了继承关系,...

    UML讲义13-数据库设计.ppt

    1. 泛化关系:泛化关系在UML中通常表现为类的继承,即一个子类继承自一个或多个父类。在数据库设计中,有两种常见的映射方式: - 方法1:将每个类(包括父类和子类)都映射为单独的表。这种方式允许灵活地独立修改...

    汽车修理信息管理系统

    如果子类仅继承父类属性而无额外属性,则通常无需创建新表,而是在父类表中增加类型区分字段。 3. **原则三:处理一对多关联**。通过在“多”的一方的表中增加“一”的一方表的主键作为外键,来表示两者之间的关联...

Global site tag (gtag.js) - Google Analytics