《三》混合使用“一个类继承体系一张表”和“每个子类一张表”
比如上面的例子,worker类可能属性很少,而farmer属性却很多,把两者都与person放在同一张表中,则显得表的 结构不是很合理,会有很多字段是null。所以我们可以把属性少的worker与person放在一张表中维护,而对farmer单独用一张表保存信息。
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" discriminator-value="0">
<id name="id">
<generator class="native"/>
</id>
<discriminator column="type" type="int"/>
<property name="name"/>
<property name="age"/>
<subclass name="Worker" discriminator-value="1">
<property name="work_year"/>
</subclass>
<subclass name="Farmer" discriminator-value="2"> //鉴别器的默认值是类的名称,字符串类型
<join table="farmer">
<key column="person_id"/>
<property name="farm_name"/>
</join>
</subclass>
</class>
</hibernate-mapping>
执行以上代码,可能会出现问题,跟hibernate配置有关。我们在前面配置了:
<property name="hibernate.hbm2ddl.auto">create</property>
在每次启动应用的时候,会先到数据库中删除相应的表。首先删除farmer表,它可以正确删除,然后根据配置文件(配置文件中表明只有这两张表)又要去删除person表。在我们前面写每个子类对应一张表时,生成了三张表,他们当时还在数据库中(名字前后一样)。也即是说第一次运行时,删的farmer表其实是上面产生的farmer表。由于根据要求要去删除person表,这时就会报错。因为worker表尚未删除,先删除person表,会引起外键关联错误。
所以可以手动把相关表删掉,再运行就可以通过了。
产生的sql语句如下:
Hibernate: insert into person (name, age, type) values (?, ?, 0)
Hibernate: insert into person (name, age, work_year, type) values (?, ?, ?, 1)
Hibernate: insert into person (name, age, type) values (?, ?, 2)
Hibernate: insert into farmer (farm_name, person_id) values (?, ?)
数据库中的表结构为:
person表:
+----+------+--------+------+---------------+
| id | type | name | age | work_year |
+----+------+--------+------+---------------+
| 1 | 0 | person | 22 | NULL |
| 2 | 1 | worker | 30 | 11 |
| 3 | 2 | farmer | 31 | NULL |
+----+------+--------+------+-----------+
farmer表:
+-----------+------------------+
| person_id | farm_name |
+-----------+-------------------+
| 3 | little candy |
+-----------+-------------------+
分享到:
相关推荐
Hibernate提供了第一级缓存(Session级别的)和第二级缓存(SessionFactory级别的)。第一级缓存默认开启,而第二级缓存则需要通过配置和插件实现,如EhCache或Infinispan。 10. **懒加载与即时加载** Hibernate...
作为“从入门到精通”系列的第二篇,本教程将建立在第一篇的基础之上,进一步扩展对Hibernate的理解。 【描述】:“最经典的hibernate教程_从入门到精通_第二篇” 本教程旨在提供一个全面的Hibernate学习路径,让...
12. **缓存机制**:深入理解Hibernate的缓存策略,包括一级缓存(Session级)和二级缓存(SessionFactory级),以及第三方缓存插件如Ehcache的集成。 13. **性能优化**:分享一些实用的Hibernate性能调优技巧,如...
8. **缓存机制**:学习Hibernate的缓存策略,包括一级缓存(Session级别的缓存)和二级缓存(SessionFactory级别的缓存),以及第三方缓存集成,如EhCache和Redis。 9. **性能优化**:讨论如何优化Hibernate的性能...
这篇文档旨在提供对Hibernate API的深入理解,帮助开发者更高效地使用Hibernate进行数据库操作。 一、Hibernate概述 Hibernate是Java开发中广泛使用的ORM框架,它提供了一种在Java应用中持久化数据到关系数据库的...
8. **第二级缓存**:除了默认的一级缓存(Session级别的缓存),Hibernate还支持二级缓存,用于存储多个Session共享的数据,提高性能。可以通过配置插件如EhCache实现。 9. **Transaction管理**:Hibernate提供了...
本篇内容将通过丰富的实例来深入探讨Hibernate的核心概念和技术,帮助读者从入门到精通,掌握其所有主要用法。** ### 一、Hibernate 概述 Hibernate 提供了一种在Java应用程序中管理关系数据库模型的机制。它通过...
Hibernate提供了第一级缓存和第二级缓存。第一级缓存是每个Session内部的缓存,自动管理;第二级缓存是SessionFactory级别的,可以跨Session共享,提高性能。 十、性能优化 通过合理的配置和设计,Hibernate能提供...
**正文** Hibernate是一款开源的对象关系映射(ORM)框架,它极大地简化了Java开发者与数据库之间的交互。...这份文档是Hibernate学习者和开发者的重要参考资料,对于深入理解ORM框架以及提升开发效率具有重要作用。
这篇中文帮助文档旨在为开发者提供详尽的指南,加速他们对Hibernate的理解和应用。 一、Hibernate概述 Hibernate是一个强大的工具,它消除了Java应用程序与SQL之间的直接耦合,使得开发人员可以更专注于业务逻辑,...
这篇文档将深入探讨Hibernate API的各个方面,帮助开发者更好地理解和使用它。 一、Hibernate体系结构 Hibernate主要由以下组件构成: 1. Configuration:负责读取配置文件,建立SessionFactory。 2. ...
本篇攻略将深入探讨Hibernate的基础知识,帮助初学者理解并掌握其核心概念。 1. ** Hibernate简介** Hibernate是一个开源的ORM框架,它允许开发人员在Java应用中使用面向对象的方式来处理数据库。通过提供对象与...
6. **缓存机制** - Hibernate 提供了第一级缓存(Session 缓存)和第二级缓存,提高性能并减少数据库负载。还可以集成第三方缓存服务,如 Ehcache 或 Redis。 7. **事务管理** - Hibernate 支持 JTA 和 JDBC 事务...
二级缓存是SessionFactory级别的,可配置第三方缓存提供商如Ehcache,以提高性能。 8. **懒加载与立即加载**:懒加载是一种优化策略,仅在需要时才加载关联的对象,减少不必要的数据库访问。而立即加载则是在获取主...
十、第一级缓存与第二级缓存 第一级缓存是Session级别的,每次操作的对象都会被放入缓存,提高读写速度。第二级缓存是SessionFactory级别的,可以跨Session共享,通常用于缓存不经常改变的数据。 以上是对...
这篇文档是Hibernate的中文API,为学习和使用Hibernate提供了一个直观且易于理解的参考。 一、Hibernate概述 Hibernate是Java领域中广泛使用的ORM框架,它将数据库的操作转换为对Java对象的操作,通过配置文件和...
10. **缓存机制**:Hibernate有第一级缓存(Session级别)和第二级缓存(SessionFactory级别),还支持第三方缓存解决方案如 Ehcache 和 Infinispan。 11. **Hibernate的延时加载(Lazy Loading)**:默认情况下,...
在"第十一章.开发Spring.Struts.Hibernate应用.pdf"这个文件中,可能详细介绍了如何配置和整合这三个框架,包括Spring的bean配置、Struts的action配置、Hibernate的实体映射和数据源设置等。此外,可能还会讲解如何...
第12章 文件的上传和下载 第13章 国际化 第14章 Struts 2的标签库 第15章 Struts 2对AJAX的支持 第16章 用Struts 2实现注册登录系统 第3篇 Hibernate篇 第17章 Hibernate的Helloworld程序 第18章 配置...