`

14 继承(一)(整个继承树映射到一张表)

阅读更多

 

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


 

 

映射到如下的t_person表中 , 有以下6个字段:

1 int  id                             //主键

2 varchar  name                 //父类中的姓名

3 int  age                          //父类中的年龄      

4 int/varchar   type             //区分"人","男人","女人"  的专用字段, 默认类型是varchar, 也可以指定为int类型.  叫鉴别器字段

                                                           //Person类:type值设为0, Men类: type值设为1, Women 类: type值设为2

 

5 varchar   a                      //"男人"类专有属性   

6 varchar   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_1" auto-import="false">
	<class name="Person" table="t_person" discriminator-value="0"><!-- "鉴别值"为0 -->
		<!-- 父类的属性 -->		
		<id name="id">
			<generator class="native"/>
		</id>	
		<!-- 重点:鉴别器 -->
		<!-- 指定type字段,做区分父子具体类型用 ,各类还要指定"鉴别值": discriminator-value="1"-->
		<discriminator column="type" type="int"/>			
		<!-- 父类的属性 -->
		<property name="name"/>
		<!-- 父类的属性 -->
		<property name="age"/>		
		<!-- Mem子类的映射 -->
		<subclass name="Men" discriminator-value="1"><!-- "鉴别值"为1 -->
			<!-- Men类专有的属性a -->
			<property name="a"/>
		</subclass>
		<!-- Women子类的映射 -->
		<subclass name="Women" discriminator-value="2"><!-- "鉴别值"为2 -->
			<!-- Women类专有的属性b -->
			<property name="b"/>
		</subclass>
	</class>	
</hibernate-mapping>
 

保存与查询操作:

package extends_test.extends_1;
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_person (name, age, type) values (?, ?, 0)
			//Hibernate: insert into t_person (name, age, a, type) values (?, ?, ?, 1)
			//Hibernate: insert into t_person (name, age, b, type) values (?, ?, ?, 2)
		}
		finally
		{
			if (session != null)
			{
				session.close();
			}
		}
	}
}

 

 

 

 

 

 

 

 

  • 大小: 14.7 KB
分享到:
评论
3 楼 grossofans 2010-11-15  
jhp_sjyy 写道
数据库中是不是需要三张表啊  ?
hbm配置文件  就一个父类的吗?

应该是一张表吧!!!
2 楼 jhp_sjyy 2009-06-12  
问题解决了
1 楼 jhp_sjyy 2009-06-12  
数据库中是不是需要三张表啊  ?
hbm配置文件  就一个父类的吗?

相关推荐

    17 继承(四)每一个具体的类 映射到一张表

    标题中的“17 继承(四)每一个具体的类 映射到一张表”指出,我们将关注的是类继承在Hibernate中的映射策略。在传统的面向对象编程中,继承允许我们创建一个新类(子类)并继承父类的属性和方法,以此实现代码复用和...

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

    本篇将详细介绍Hibernate继承映射的第一种策略——每棵类继承树对应一张表,即单一表继承策略。 ### 单一表继承策略 在单一表继承策略中,所有类层次结构中的实例都存储在同一张数据库表中。这种策略通过在表中...

    Hibernate继承映射二:每个子类一张表

    总结来说,“每个子类一张表”的继承映射策略是Hibernate提供的一种处理继承关系的方法,它将类的继承结构映射到数据库的多个表中。这种策略适合于子类具有大量特有属性的情况,但需要权衡可能带来的数据库设计复杂...

    hibernate映射继承关系(每个类都对应一张表)

    总结起来,"每个类都对应一张表"的继承映射策略在Hibernate中是一种直接且易于理解的方法,适合那些每个类都有独特属性的情况。然而,它可能不适合所有场景,特别是当子类众多或者需要减少数据冗余时。在实际应用中...

    Hibernate继承映射一:每个类分层结构一张表

    本篇文章主要探讨的是Hibernate的继承映射策略,特别是“每个类分层结构一张表”(Table per Concrete Class)的方式。这种映射策略是Hibernate提供的多种继承映射方案之一,适用于处理复杂的对象模型。 首先,我们...

    Hibernate继承映射的第一种策略:每个具体类一张表

    Hibernate通过多种继承映射策略解决了这一问题,其中“每个具体类一张表”是最为直观的一种。这种方式适用于子类较多,且子类之间差异较大的场景。 1. **基本概念** - **实体类**:在Hibernate中,被映射到数据库...

    用Hibernate映射继承关系

    本主题聚焦于“用Hibernate映射继承关系”,我们将深入探讨Hibernate如何处理对象的继承层次结构,并将其映射到数据库中的表。 Hibernate支持多种继承策略,包括单一表继承(Single Table Inheritance)、联合表...

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

    本文将详细探讨“Hibernate继承映射的第一种策略:每个类对应一张表”的概念、实现方式以及其优缺点。 首先,我们需要理解Hibernate继承映射的基本策略。在面向对象编程中,类继承是常见的代码复用手段,但在数据库...

    hibernate的继承映射关系

    在这种策略下,继承树的根类(如Employee)对应数据库中的一张表,而具体类的信息则通过添加一个类型区分字段来存储。这种方式需要在根类对应的表中增加一个字段来标识具体类的类型,通常命名为class或者subclass,...

    Hibernate继承关系映射.pdf

    单表映射策略将继承树中的所有类映射到同一张表中,通过一个额外的“识别字段”(通常称为`discriminator`)来区分不同类型的子类记录。 #### 示例代码 ```xml &lt;!-- 其他属性映射省略 --&gt; &lt;!-- Notepad...

    hibernate继承映射.rar

    本教程以“Hibernate-lab2”为例,将深入探讨Hibernate中的继承映射,为初学者提供一个清晰的学习路径。 一、Hibernate继承映射概述 Hibernate继承映射是将Java中的继承关系映射到数据库的关系模型中。在Java中,...

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

    1. **单表继承(Single Table Inheritance)**:所有子类共享同一张数据库表,使用一个标识字段来区分不同的子类实例。优点是简单,但可能导致冗余数据。 2. **表格_per_class继承(Table per Class Inheritance)*...

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

    3. **每个类单独映射到一张表**:这是一种更为灵活的策略,允许每个类(包括抽象类和具体类)都有自己的表。这种方法能够更好地处理继承层次结构中的复杂性。 4. **将类映射为一个通用的表结构**:这种方法旨在提供...

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

    这种策略将整个类继承树的所有实例存储在一张表中。表中包含所有子类的属性,通过一个鉴别器(discriminator)字段来区分不同类型的对象。例如,对于接口Payment和它的实现类CreditCardPayment、CashPayment、...

    Hibernate继承映射(annotation)

    在Java持久化框架Hibernate中,继承映射是一种关键特性,它允许开发者将对象模型的继承结构映射到数据库的表结构。在传统的面向对象编程中,继承是实现代码复用和结构化设计的重要手段,而在关系型数据库中,由于其...

Global site tag (gtag.js) - Google Analytics