《二》每个子类映射到一张表(joined-subclass)
配置文件修改为:
<?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="native"/>
</id>
<property name="name"/>
<property name="age"/>
<joined-subclass name="Worker" table="worker"
>
<key column="person_id"></key> //指定外键关联的列
<property name="work_year"/>
</joined-subclass>
<joined-subclass name="Farmer" table="farmer"
>
<key column="person_id"/> //指定外键关联的列
<property name="farm_name"/>
</joined-subclass>
</class>
</hibernate-mapping>
上面的配置中,我们并没有单独为worker和farmer编写映射文件,而是通过joined-subclass节点在父类映射文件中对子类进行了配置。
仍然执行上面的测试代码,查看输出的sql语句为:
写道
Hibernate: insert into person (name, age) values (?, ?)
Hibernate: insert into person (name, age) values (?, ?)
Hibernate: insert into worker (work_year, person_id) values (?, ?)
Hibernate: insert into person (name, age) values (?, ?)
Hibernate: insert into farmer (farm_name, person_id) values (?, ?)
这时数据库中就有三张表了,分别为:person表,worker表,farmer表。结构如下:
person:
+----+--------+------+
| id | name | age |
+----+--------+------+
| 1 | person | 22 |
| 2 | worker | 30 |
| 3 | farmer | 31 |
+----+--------+------+
worker:
+-----------+----------------+
| person_id | work_year |
+-----------+----------------+
| 2 | 11 |
+-----------+----------------+
farmer:
+-----------+-----------------+
| person_id | farm_name |
+-----------+-----------------+
| 3 | little candy |
+-----------+-----------------+
查询:
static void query(int id) {
Session s = HibernateUtil.getSession();
Transaction tx = s.beginTransaction();
Worker worker = (Worker) s.get(Worker.class, id);
tx.commit();
System.out.println("year: "+worker.getWork_year());
}
调用query(2);
打印输出的sql语句为:
Hibernate: select worker0_.person_id as id8_0_, worker0_1_.name as name8_0_, worker0_1_.age as age8_0_, worker0_.work_year as work2_9_0_ from worker worker0_ inner join person worker0_1_ on worker0_.person_id=worker0_1_.id where worker0_.person_id=?
year: 11
如果把着色部分修改为:Worker worker = (Worker) s.get(Person.class
, id);
打印输出的sql语句为:
Hibernate: select person0_.id as id8_0_, person0_.name as name8_0_, person0_.age as age8_0_, person0_1_.work_year as work2_9_0_, person0_2_.farm_name as farm2_10_0_, case when person0_1_.person_id is not null then 1 when person0_2_.person_id is not null then 2 when person0_.id is not null then 0 end as clazz_0_ from person person0_ left outer join worker person0_1_ on person0_.id=person0_1_.person_id left outer join farmer person0_2_ on person0_.id=person0_2_.person_id where person0_.id=?
year: 11
由此可见:hibernate支持多态查询。在查询语句中,指定父类类型,hibernate会关联三张表到其中去查,而指定了具体的类型,则只会查找相关的表。如果子类有很多,那么最好明确指定查的子类,否则,对多表关联查询,会带来性能问题。
分享到:
相关推荐
Hibernate提供了第一级缓存(Session级别的)和第二级缓存(SessionFactory级别的)。第一级缓存默认开启,而第二级缓存则需要通过配置和插件实现,如EhCache或Infinispan。 10. **懒加载与即时加载** Hibernate...
本教程旨在提供一个全面的Hibernate学习路径,让你能够熟练地运用Hibernate进行数据库操作,提升开发效率。通过深入学习,你将掌握如何利用Hibernate进行对象关系映射(ORM),事务管理,查询优化以及与其他技术如...
这篇文档集合了丰富的Hibernate实践知识,对于初学者来说是一份宝贵的资源。 1. **Hibernate核心概念** Hibernate的核心在于持久化对象,它允许我们将Java类映射到数据库表,对象的属性对应于表的列。实体类是Java...
这篇关于“hibernate测试”的文章旨在深入探讨Hibernate的核心概念,以及如何进行有效的测试以确保其在项目中的稳定运行。 1. **Hibernate简介** Hibernate是一个开源的Java库,它为Java应用程序提供了一个框架,...
《Hibernate学习笔记》是一份深度剖析Hibernate框架的教程,旨在为初学者提供全面而深入的指导,帮助他们快速掌握这个强大的Java对象关系映射(ORM)工具。Hibernate作为Java领域中广泛使用的ORM解决方案,它极大地...
8. **缓存机制**:学习Hibernate的缓存策略,包括一级缓存(Session级别的缓存)和二级缓存(SessionFactory级别的缓存),以及第三方缓存集成,如EhCache和Redis。 9. **性能优化**:讨论如何优化Hibernate的性能...
Hibernate 是一个开源的对象关系映射...通过深入学习这份Hibernate-api文档,开发者能够熟练掌握Hibernate的核心概念、配置、查询机制以及对象关系映射,从而在实际项目中更加自如地运用Hibernate这一强大的ORM工具。
Hibernate 提供了两级缓存:第一级缓存是Session级别的,自动管理;第二级缓存可配置第三方缓存系统,如Ehcache,提升性能。 ### 八、事务管理 Hibernate 支持JTA和JDBC事务管理,确保数据一致性。 ### 九、联合...
8. **第二级缓存**:除了默认的一级缓存(Session级别的缓存),Hibernate还支持二级缓存,用于存储多个Session共享的数据,提高性能。可以通过配置插件如EhCache实现。 9. **Transaction管理**:Hibernate提供了...
在Java开发领域,持久化是不可或缺的一部分,而Hibernate作为Java中最流行的ORM(对象关系映射)框架之一,它极大地简化了数据库操作。本篇将深入探讨“Java Persistence with Hibernate”的核心概念,并通过具体的...
在本篇“我的Hibernate学习笔记(4)完”中,我们将深入探讨Hibernate这一流行的Java对象关系映射(ORM)框架,以及如何通过源码和工具进行高效开发。这篇笔记不仅包含理论知识,还提供了实际操作的指导,以帮助读者更...
**正文** Hibernate是一款开源的对象关系映射(ORM)框架,它极大地简化了Java开发者与数据库之间的交互。...这份文档是Hibernate学习者和开发者的重要参考资料,对于深入理解ORM框架以及提升开发效率具有重要作用。
<br>阅读第 1 章 Hibernate入门 ,这是一篇包含详细的逐步指导的指南。本指南的源代码包含在发行包中,你可以在doc/reference/tutorial/目录下找到。 <br>阅读第 2 章 体系结构(Architecture)来理解...
Hibernate是一款强大的Java持久化框架,它简化了数据库与Java对象之间的交互。Hibernate API是这个框架的核心,提供了丰富的接口和类,使得开发人员可以方便地进行数据的增删改查操作,而无需过多关注底层SQL的编写...
这篇中文帮助文档旨在为开发者提供详尽的指南,加速他们对Hibernate的理解和应用。 一、Hibernate概述 Hibernate是一个强大的工具,它消除了Java应用程序与SQL之间的直接耦合,使得开发人员可以更专注于业务逻辑,...
<br>阅读第 1 章 Hibernate入门 ,这是一篇包含详细的逐步指导的指南。本指南的源代码包含在发行包中,你可以在doc/reference/tutorial/目录下找到。 <br>阅读第 2 章 体系结构(Architecture)来理解...
Hibernate提供了两级缓存:第一级缓存是Session级别的,自动管理;第二级缓存则可配置为全局共享,如 EhCache 或 Infinispan。 11. **事务管理** Hibernate支持编程式和声明式事务管理。编程式使用`Transaction`...
6. **缓存机制** - Hibernate 提供了第一级缓存(Session 缓存)和第二级缓存,提高性能并减少数据库负载。还可以集成第三方缓存服务,如 Ehcache 或 Redis。 7. **事务管理** - Hibernate 支持 JTA 和 JDBC 事务...
这篇笔记将深入探讨Hibernate的核心概念和技术细节,旨在帮助你更好地理解和应用这个强大的工具。 1. **对象关系映射(ORM)**:ORM是Hibernate的核心,它提供了一种方式,将Java对象模型与数据库表结构进行对应,...
十、第一级缓存与第二级缓存 第一级缓存是Session级别的,每次操作的对象都会被放入缓存,提高读写速度。第二级缓存是SessionFactory级别的,可以跨Session共享,通常用于缓存不经常改变的数据。 以上是对...