hibernate详解(二)---->>继承关系映射(一)
继承是面对对象编程中一个很重要的特征,在做面对对象的分析和设计时,经常会设计出具体继承关联的持久化类,如何把这些持久化类之间的继承关系映射到关系数据库上的问题已经解决,继承在对象模型中是 is a(是一个)的关系,但是在关系模型中,实体之间只有has a(有一个)的关系,也就是说,继承在对象模型和关系模型上是不匹配的。所幸的是,hibernate提供了3种常见的基继承映射方案。
第一种:整个继承层次一张表
Singer.java
package com.zxf.domain;
/** 歌手抽象类 */
public abstract class Singer {
private Long id; //对象标识符(OID)
private String name; //名称
private String region; //歌手所属区域(如:华人、日韩、欧美等)
private String description; //描述
public Singer(){} //无参数的构造方法
//以下为所有属性的getters和setters方法...
}
SingleSinger.java
package com.zxf.domain;
/** 单人歌手实体类 */
public class SingleSinger extends Singer {
private Character gender; //性别
public SingleSinger(){} //无参数的构造方法
//以下为所有属性的getters和setters方法...
}
Bands.java
package com.qiujy.domain;
/** 乐队组合实体类 */
public class Bands extends Singer {
private String leader; //主唱姓名
public Bands(){} //无参数的构造方法
//以下为所有属性的getters和setters方法...
}
Singer.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!-- 映射持久化类 -->
<class name="com.zxf.domain.Singer" table="singer">
<!-- 映射对象标识符 -->
<id name="id" column="id" type="long">
<generator class="native" />
</id>
<!-- 指定鉴别器字段,要放置在所有属性映射之前 -->
<discriminator column="type" type="string" />
<!-- 映射普通属性 -->
<property name="name"/>
<property name="region"/>
<property name="description"/>
<!-- 映射子类,指定鉴别字段值 -->
<subclass name="com.zxf.domain.SingleSinger"
discriminator-value="S">
<!-- 映射本子类的属性 -->
<property name="gender"/>
</subclass>
<!-- 映射子类,指定鉴别字段值 -->
<subclass name="com.zxf.domain.Bands"
discriminator-value="B">
<!-- 映射本子类的属性 -->
<property name="leader"/>
</subclass>
</class>
</hibernate-mapping>
配置文件 hibernate.cfg.xml
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 数据库方言设置 -->
<property name="hibernate.dialect">
org.hibernate.dialect.MySQLInnoDBDialect
</property>
<!-- 数据库连接参数设置 -->
<property name="hibernate.connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="hibernate.connection.url">jdbc:mysql:///hibernate</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123</property>
<!--实际操作数据库时是否显示SQL -->
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<!--将数据库schema的DDL导出到数据库 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 以下定义实体类与数据库表的映像文件 -->
<mapping resource="com/zxf/domain/Singer.hbm.xml" />
</session-factory>
</hibernate-configuration>
下面写一个测试类来测试一下:
SingerTest.java
import java.util.List;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import com.zxf.domain.Bands;
import com.zxf.domain.Singer;
import com.zxf.domain.SingleSinger;
/**
* 继承映射测试
* @author z_xiaofei168
*/
public class SingerTest {
@SuppressWarnings("unchecked")
public static void main(String[] args) {
//根据hibernate的默认配置文件构建一个SessoinFactory实例
SessionFactory sessionFactory =
new Configuration().configure().buildSessionFactory();
testAdd(sessionFactory);
testQuery(sessionFactory);
}
public static void testAdd(SessionFactory sessionFactory) {
//获取Session实例
Session session = sessionFactory.openSession();
//开启事务
session.beginTransaction();
SingleSinger singer = new SingleSinger();
singer.setName("周杰棍");
singer.setRegion("华人");
singer.setDescription("大舌头");
singer.setGender('男');
session.save(singer);
Bands bands = new Bands();
bands.setName("花朵乐队");
bands.setRegion("日韩");
bands.setDescription("以口水歌为主");
bands.setLeader("大伟");
session.save(bands);
//提交事务
session.getTransaction().commit();
//关闭Session
session.close();
}
public static void testQuery(SessionFactory sessionFactory) {
//获取Session实例
Session session = sessionFactory.openSession();
//开启事务
session.beginTransaction();
List<Singer> singers = session.createQuery("from Singer").list();
for (Singer singer2 : singers) {
if(singer2 instanceof SingleSinger){
SingleSinger ss = (SingleSinger)singer2;
System.out.println("是单人歌手:" + ss.getName() + ",性别:" + ss.getGender());
}else if(singer2 instanceof Bands){
Bands ban = (Bands)singer2;
System.out.println("是乐队组合:" + ban.getName() + ",主唱:" + ban.getLeader());
}
}
//提交事务
session.getTransaction().commit();
//关闭Session
session.close();
}
}
程序的运行结果如下所示:
分享到:
相关推荐
《Hibernate继承映射详解》 在Java开发中,对象关系映射(ORM)框架如Hibernate大大简化了数据库操作。Hibernate不仅提供了对基本数据类型的映射,还支持复杂的数据结构,如继承关系的映射。本篇文章将深入探讨...
Hibernate是Java领域中一款强大的对象关系映射(ORM)框架,它允许开发者使用面向对象的方式来操作数据库,极大地简化了Java数据库编程。在这个“hibernate技术详解”中,我们将深入探讨Hibernate的核心概念、配置、...
在当今的Web开发领域,数据持久化是一个必不可少的环节,而Hibernate作为Java领域广泛使用的对象关系映射(ORM)框架,极大地简化了数据库操作。然而,随着互联网应用的规模不断扩大,对数据访问速度的要求也日益...
8. **继承映射** - `@Inheritance`: 控制类的继承策略,如SINGLE_TABLE、JOINED、TABLE_PER_CLASS。 - `@DiscriminatorValue`: 用于多态继承,定义子类在父类表中的区分值。 9. **复合主键** - `@EmbeddedId`: ...
除了继承关系,描述中还提到了Hibernate的关联映射,这是另一个核心概念: - **一对一(One-to-One)映射**:一个实体与另一个实体有唯一的关系,例如一个人只有一个身份证。可以使用`@OneToOne`注解实现,可以是...
而`hibernate-annotations-3.4.0.jar`是Hibernate框架中的一个关键组件,它主要负责提供对象-关系映射的注解支持,使得开发者能够以更加面向对象的方式来处理数据库操作。 Hibernate Annotations是Hibernate框架的...
从单向基于集合的关联映射开始,文档展示了如何在Hibernate中表示一对多的关系。随后,通过双向关联的处理,揭示了如何维护实体间更复杂的关系。此外,文档还详细阐述了值集合和嵌套关联的管理,以及如何在这些复杂...
Hibernate,作为一款强大的对象关系映射(ORM)框架,为Java开发者提供了便捷的数据持久化服务。本文将深入解析Hibernate 3.6.8版本的中文帮助文档,帮助开发者更好地理解和运用这个优秀的工具。 一、Hibernate简介...
《Hibernate继承映射详解》 Hibernate,作为Java领域中的一款著名对象关系映射(ORM)框架,极大地简化了数据库操作。在实际项目中,我们常常会遇到类的继承关系,而Hibernate提供了强大的支持来处理这种继承关系的...
为了更好地处理这一过程,众多框架和技术应运而生,其中Hibernate作为一款优秀的对象关系映射(ORM)工具,在Java开发中占据了极其重要的地位。本文将基于提供的文件信息《hibernate入门课件--introduce hibernate....
2. 继承映射:支持单表、表-per-hierarchy、表-per-subclass 等继承策略。 3. 联接查询和子查询:优化查询性能,避免 N+1 问题。 4. 延迟加载(Lazy Loading):按需加载关联对象,减少内存消耗。 5. 动态模型:无需...
在对象关系映射(ORM)框架Hibernate中,对象与数据库表之间的关联是通过一个XML配置文件来定义的。这个XML文件包含了映射元素,用于描述Java类如何转化为数据库中的表。映射文档可以通过自动化工具如XDoclet、...
### Hibernate的继承多态映射关系详解 在软件开发领域,特别是使用面向对象编程语言如Java进行开发时,我们经常需要处理复杂的类继承关系。在ORM(Object-Relational Mapping)框架如Hibernate中,如何优雅地将这些...
Hibernate是一个开源的对象关系映射(ORM)框架,它提供了一种在Java应用程序中管理关系数据库模型的方式。Hibernate自动处理SQL的生成和结果集的映射,使得开发者可以更专注于业务逻辑,而不是底层数据库的细节。 ...
**标题:“Hibernate继承映射(Annotation)详解”** 在Java持久化框架Hibernate中,继承映射是一种关键特性,它允许开发者将对象模型的继承结构映射到数据库的表结构。在传统的面向对象编程中,继承是实现代码复用和...
- 继承映射 - 查询分析 - 复杂类型映射 ### 总结 本课程全面介绍了Hibernate的基本概念、配置与使用方法。从简单的HelloWorld示例入手,逐步深入到核心开发接口、关系映射、查询语言以及性能优化等多个方面,...
Hibernate作为Java领域中最流行的ORM(对象关系映射)框架之一,极大地简化了数据库操作。其中,Hibernate注解是其核心特性之一,它允许开发者通过在实体类上添加注解来描述数据表结构,而无需编写XML配置文件。本文...
在Java开发领域,ORM(对象关系映射)框架是连接数据库的重要工具,而Hibernate作为其中的佼佼者,一直以来都深受开发者喜爱。本篇文章将深入探讨 Hibernate 实体管理器(Hibernate EntityManager)3.2版本的核心...
Hibernate 是一款开源的对象关系映射(ORM)框架,它为Java开发者提供了一种在关系数据库和面向对象编程之间架起桥梁的解决方案。通过使用Hibernate,开发人员可以避免直接编写SQL语句,而是用Java对象来操作数据库...
Hibernate Annotations是Hibernate框架的一个扩展,它允许开发者使用Java语言的注解(Annotations)来定义对象与数据库表之间的映射关系,替代传统的Hibernate XML配置文件。这使得代码更加简洁,更易于维护,并且与...