`

Hibernate继承映射

阅读更多
继承映射分为三种情况
1.每个子类一张表
比如说有一个Person父类,有一个Student子类,一个Teacher子类。
假如我们操作的都是Student子类或者Teacher子类,就要为Teacher和Student各建立一张表。
Person类中有一些属性,被Student和Teacher继承下来。
而Student和Teacher有自己的属性,比如salaray和score.

类声明:

/**
 * Person作为父类 
 */
public class Person
{
	private String id;
	
	private String name;
}


/**
 * 继承父类Person 
 */
public class Student extends Person 
{
	 
	private String cardId;
}


public class Teacher	extends Person
{
	private int salary;
}






根据继承原则,私有属性不能被继承。但是在我们声明Person类的时候,由于里面的getter和setter都是public,因此当在Student.hbm.xml中使用代码提示的时候,就可以看到:



这是因为Hibernate获取我们的映射对象名称是根据方法名的。具体操作方法在之前反射的内容http://alleni123.iteye.com/admin/blogs/1965343中提到过。


Teacher.hbm.xml和Student.hbm.xml

<hibernate-mapping package="extend_mapping">
	<class name="Teacher" table="test_teacher">
	
 		<id name="id" column="id" type="string">
 			<generator class="uuid"></generator>
 		</id>
 		
 		<property name="name" column="name" type="string"/>
 		<property name="salary" column="salary" type="int"/>
 		
 	
	</class>

</hibernate-mapping>

<!--========================-->

<hibernate-mapping package="extend_mapping">
	<class name="Student" table="test_student">
	
 		<id name="id" column="id" type="string">
 			<generator class="uuid"></generator>
 		</id>
 		
 		
 		<property name="name" column="name" type="string"/>
 		<property name="cardId" column="cardId" type="string"></property>
 		
 		 
	</class>

</hibernate-mapping>



最后生成SQL语句:


Hibernate: create table test_student (id varchar2(255 char) not null, name varchar2(255 char), cardId varchar2(255 char), primary key (id))
Hibernate: create table test_teacher (id varchar2(255 char) not null, name varchar2(255 char), salary number(10,0), primary key (id))



插入

	Session session=HibernateUtil.openSession();
		
	 
		
		Student s=new Student();
		s.setCardId("111");
		s.setName("alleni");
		
		Teacher teacher=new Teacher();
		
		teacher.setSalary(1000);
		teacher.setName("eline");
		
		
		session.save(s);
		session.save(teacher);
		
		Transaction tx=session.beginTransaction();
		
		tx.commit();


生成数据:




查询

由于Student和Teacher表都有name, 我们会想查询两个表中的所有的name列内容。

因此这里要使用多态查询,如下:
Query query=session.createQuery("from Person");

'from Person'表示将继承了Person的类所映射的表全部查询出来。



注意:
List  l=query.list();
这里会报错,org.hibernate.hql.internal.ast.QuerySyntaxException: Person is not mapped [from Person]

原因是这里我们并没有定义Person的hbm文件。
解决方法是将Person的package名称加进查询语句中:
Query query=session.createQuery("from extend_mapping.Person");


完整代码如下:

		Session session=HibernateUtil.openSession();
		
	 
		//多态查询
		Query query=session.createQuery("from extend_mapping.Person");

 		
 		Iterator it=query.iterate();
 		
 		while(it.hasNext()){
 			Person p=(Person) it.next();
 			System.out.println(p.getClass().getName());
 			System.out.println(p.getName());
 			
 		}
 		
		
		
// 		List<Person>  l=query.list();
// 		
// 		System.out.println(l.size());
// 		
// 		for(Person p:l){
// 			System.out.println(p.getName());
// 		}


这里while循环语句输出如下:
Hibernate: select teacher0_.id as col_0_0_ from test_teacher teacher0_
Hibernate: select student0_.id as col_0_0_ from test_student student0_

extend_mapping.Teacher
eline
extend_mapping.Student
alleni

这里Hibernate分别向Person的两个子类中的对应的表发了SQL查询语句。
获取的内容也被Hibernate封装到了对应Class的类对象中。



  • 大小: 29.6 KB
  • 大小: 50.1 KB
分享到:
评论

相关推荐

    Hibernate继承映射代码

    本主题将深入探讨"Hibernate继承映射+C3P0代码"的相关知识点。 首先,让我们理解Hibernate的继承映射。在Java中,我们可以创建一个基类,然后派生出多个子类,这种设计模式在数据库中也可以被映射出来。Hibernate...

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

    Hibernate继承映射是将Java类的继承关系映射到数据库表的一种策略,使得对象模型的复杂性能够平滑地转化为关系数据库模型。本篇将详细介绍Hibernate继承映射的第一种策略——每棵类继承树对应一张表,即单一表继承...

    hibernate继承映射.rar

    《Hibernate继承映射详解》 Hibernate,作为Java领域中的一款著名对象关系映射(ORM)框架,极大地简化了数据库操作。在实际项目中,我们常常会遇到类的继承关系,而Hibernate提供了强大的支持来处理这种继承关系的...

    Hibernate继承映射(annotation)

    **标题:“Hibernate继承映射(Annotation)详解”** 在Java持久化框架Hibernate中,继承映射是一种关键特性,它允许开发者将对象模型的继承结构映射到数据库的表结构。在传统的面向对象编程中,继承是实现代码复用和...

    Hibernate继承映射-概述

    《Hibernate继承映射详解》 在Java开发中,对象关系映射(ORM)框架如Hibernate大大简化了数据库操作。Hibernate不仅提供了对基本数据类型的映射,还支持复杂的数据结构,如继承关系的映射。本篇文章将深入探讨...

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

    本篇文章将详细探讨Hibernate继承映射的策略,特别是“每个具体类一张表”(Table Per Concrete Class)的映射方式。 在面向对象编程中,继承是常见的代码复用手段,但在关系型数据库中,这种概念并不直接对应。...

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

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

    hibernate继承映射教学

    针对hibernate的继承映射部分做了几个测试的例子,更加直观的阐述了继承映射的几种方式以及对应的表结构方式,文件被分割成3部分 http://download.csdn.net/source/259075 http://download.csdn.net/source/259072 ...

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

    本篇主要探讨的是Hibernate中的继承映射策略,特别是“每个子类一张表”(Table per subclass)的方式。这种方式也被称为单表继承或多表继承,是Hibernate支持的四种继承映射策略之一。了解并熟练掌握这种映射模式...

    用Hibernate映射继承关系

    ### 用Hibernate映射继承关系 #### 14.1 继承关系树的每个具体类对应一个表 在Hibernate中映射继承关系时,一种常见的策略是将继承关系树的每个具体类映射到单独的数据库表中。这种方法称为**表/类映射**(Table/...

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

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

    Hibernate教程17_继承映射

    在Java世界中,ORM(对象关系映射)框架如Hibernate极大地简化了数据库操作。本教程主要探讨的是Hibernate中的“继承映射...学习并实践这些例子,有助于巩固对Hibernate继承映射的理解,并提升在实际项目中的应用能力。

Global site tag (gtag.js) - Google Analytics