《四》每个具体类映射一张独立的表(union-subclass),即表与子类之间的独立一对一关系
所有的子类的表中的信息都是完整的,不需要对表进行关联了。
person.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 package="hibernate.extend" auto-import="false">
<class name="Person" table="person">
<id name="id">
<generator class="hilo"/>
</id>
<property name="name"/>
<property name="age"/>
<union-subclass name="Worker" table="worker">
<property name="work_year"/>
</union-subclass>
<union-subclass name="Farmer" table="farmer">
<property name="farm_name"/>
</union-subclass>
</class>
</hibernate-mapping>
产生的sql语句为:
写道
Hibernate: insert into person (name, age, id) values (?, ?, ?)
Hibernate: insert into worker (name, age, work_year, id) values (?, ?, ?, ?)
Hibernate: insert into farmer (name, age, farm_name, id) values (?, ?, ?, ?)
Hibernate: select person0_.id as id8_0_, person0_.name as name8_0_, person0_.age as age8_0_, person0_.work_year as work1_9_0_, person0_.farm_name as farm1_10_0_, person0_.clazz_ as clazz_0_ from ( select null as work_year, id, age, name, null as farm_name, 0 as clazz_ from person union select work_year, id, age, name, null as farm_name, 1 as clazz_ from worker union select null as work_year, id, age, name, farm_name, 2 as clazz_ from farmer ) person0_ where person0_.id=?
执行后,数据库中表结构为:
person表:
+----+--------+------+
| id | name | age |
+----+--------+------+
| 1 | person | 22 |
+----+--------+------+
worker表:
+----+--------+------+----------------+
| id | name | age | work_year |
+----+--------+------+----------------+
| 2 | worker | 30 | 11 |
+----+--------+------+----------------+
farmer表:
+----+--------+------+--------------+
| id | name | age | farm_name|
+----+--------+------+--------------+
| 3 | farmer | 31 | little candy |
+----+--------+------+--------------+
注意:注意到我们把主键生成器改为使用高低键生成器了。因为native会根据使用的数据库自动选择相应的主键生成方式,由于我使用的是mysql数据库,对主键字段是自动增长的。也就是说在三个表中会有相同的主键id。这样在查询时就会出现问题。当你查一个id为1的person时,他会从三张表中都获得结果,这显然不行。所以这里改用高低键hilo生成方式,就不会出现这种问题。从上面的表中的数据也可以看出来。三个表的id是互不相同的。这种设计更符合实际需求。
补充:
同时,有时候父类是抽象类,这样就不需要在数据库中产生表了。这只需要加一个属性配置一下即可:
<?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 package="hibernate.extend" auto-import="false" abstract="true"
>
<class name="Person" table="person">
<id name="id">
<generator class="hilo"
/>
</id>
<property name="name"/>
<property name="age"/>
<union-subclass name="Worker" table="worker">
<property name="work_year"/>
</union-subclass>
<union-subclass name="Farmer" table="farmer">
<property name="farm_name"/>
</union-subclass>
</class>
</hibernate-mapping>
分享到:
相关推荐
Hibernate 提供了第一级缓存和第二级缓存,以及查询缓存,能够提高数据访问速度。学习如何配置和使用缓存,可以有效提升应用性能。 9. **延迟加载和懒加载**: 延迟加载(Lazy Loading)是Hibernate的一项重要...
Hibernate学习笔记整理 以下是 Hibernate 框架的详细知识点: Hibernate 介绍 Hibernate 是一个 ORM(Object-Relational Mapping)框架,用于将 Java 对象映射到数据库表中。它提供了一个简洁的方式来访问和操作...
本人精心搜集了学习hibernate的资料,一些是我以前学习用的,一些是新搜集的 资料。 <br>搜集清单和说明 1:hibernate学习源码,这是我以前做练习的代码,希望对感兴趣的朋友 有些帮助。 2:...
- **Ehcache.jar:** 第三方缓存组件,用于实现Hibernate的一级缓存和二级缓存。 - **Hibernate3.jar:** Hibernate核心库,包含所有主要的Hibernate功能。 - **Jta.jar:** Java Transaction API,用于处理事务。 - **...
《Hibernate学习笔记特别详细》 Hibernate,作为一款开源的Object-Relational Mapping(ORM)框架,为Java开发者提供了强大的数据库操作支持。它简化了数据库访问的复杂性,使得开发人员可以像操作对象一样操作...
《Hibernate学习文档集合》 Hibernate,作为Java领域中的一款强大且广泛应用的对象关系映射(ORM)框架,极大地简化了数据库操作。本集合包含了三个关键的学习文档,分别关注于Hibernate的操作基础、对象关系映射和...
标题"Hibernate 中文api 等学习资料"暗示了这是一组针对Hibernate ORM框架的中文学习资源,包括API文档和其他指南,旨在帮助用户更好地理解和使用Hibernate。 描述中的"hibernate orm框架api中文文档,学习资料,...
hibernate概述,hibernate入门Demo,hibernate配置文件详解(全局配置,实体类映射配置),配置实体规则,核心API详解(Configuration,sessionFactory,session,Transaction),hibernate中的对象状态以及刷新能缓存机制 ...
**hibernate学习资料大合集** 本资料合集涵盖了关于Hibernate的各种学习资源,包括PDF、CHM和Word文档,旨在帮助开发者深入理解和掌握Hibernate这一强大的Java持久化框架。Hibernate作为一个对象关系映射(ORM)...
6. **缓存机制**:Hibernate内置了第一级缓存和第二级缓存,可以提高数据访问性能。理解何时启用缓存以及如何管理缓存,对于优化应用程序性能很有帮助。 7. **事务管理**:Hibernate支持JTA和JDBC两种事务管理方式...
6. Hibernate的缓存机制,了解第一级缓存和第二级缓存的概念及应用场景。 7. Hibernate的事务管理和并发控制策略。 通过深入学习和实践,你将能够熟练运用Hibernate来构建高效、稳定的Java应用,无论是在Web应用...
Java框架中关于hibernate的基础学习
在本篇《Hibernate学习笔记》中,我们将深入探讨Hibernate这一流行的Java对象关系映射(ORM)框架。Hibernate允许开发者以面向对象的方式处理数据库操作,极大地简化了数据存取的复杂性。以下是一些关键知识点: 1....
【北大青鸟Hibernate学习资料】 Hibernate是一个开源的Java ORM(对象关系映射)框架,它为开发者提供了在Java应用中管理关系数据库数据的便捷方式。本学习资料集合了多个关于Hibernate的重要主题,包括对象关系...
随着对 Hibernate 的深入学习,你将了解缓存机制、第二级缓存、查询优化、关联映射等高级特性。这将帮助你在实际项目中更好地利用 Hibernate,提高性能并降低复杂性。 总之,学习 Hibernate 从配置数据库连接开始,...
【Java相关课程系列笔记之十四Hibernate学习笔记】 Hibernate是一个开源的对象关系映射(ORM)框架,它极大地简化了Java应用程序对数据库的操作。本笔记将详细阐述Hibernate的核心概念、使用方法和特性。 一、...
Hibernate一对一数据关联 Hibernate下的多对多关系 Hibernate关系映射 Hibernate继承关系映射 Hibernate映射类型-主键生成器-核心API Hibernate3 插件Eclipse配置
6. **缓存机制**:介绍第一级缓存和第二级缓存的工作原理,以及如何配置和使用缓存来提高应用性能。 7. **实体生命周期**:阐述实体的持久化状态(瞬时、持久、托管和脱管),以及它们之间的转换过程,如保存、更新...
**hibernate学习笔记第四天源码解析** 在hibernate学习的过程中,第四天通常会深入探讨实体类、映射文件、配置文件以及查询语言等方面的内容。这些是hibernate框架的基础,也是开发者掌握持久化操作的关键。让我们...