- 浏览: 343082 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
zy_mensheng:
请问一下 怎么 js没有解析啊 还是钟表图..
调用BIEE提供的web service -
安铁辉:
师兄你很久没更新博客了
Information Dashboard Design读书笔记 -
mojunbin:
很清晰的文章
秒杀相关知识以及技术 -
yanchangjun8102:
楼主你好,我也最近在研究biee的webservice这块,按 ...
调用BIEE提供的web service -
sacredon:
不错,楼主我是看着你的这篇文章写代码调用的BIEE的Web ...
调用BIEE提供的web service
hibernate的继承映射
《一》一张表映射一棵继承树
使用discriminator(鉴别标志)
类Worker和Farmer都继承自Person
类Person的源代码如下:
package hibernate.extend; public class Person { private int id; private String name; private int age; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
类Worker的源代码如下:
package hibernate.extend; public class Worker extends Person{ public int getWork_year() { return work_year; } public void setWork_year(int work_year) { this.work_year = work_year; } private int work_year;//工人的工龄 }
类Farmer的源代码如下:
package hibernate.extend; public class Farmer extends Person { private String farm_name;//农民的农场名 public String getFarm_name() { return farm_name; } public void setFarm_name(String farm_name) { this.farm_name = farm_name; } }
只有一个映射文件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">
<class name="Person" table="person" discriminator-value="0" >
<id name="id">
<generator class="native"/>
</id>
<discriminator column="type" type="int"/>
//通过discriminator节点,我们声明了用做子类辨别标识的字段名
<property name="name"/>
<property name="age"/>
<subclass name="Worker" discriminator-value="1"
>
<property name="work_year"/>
</subclass>
<subclass name="Farmer" discriminator-value="2"
>
<property name="farm_name"/>
</subclass>
</class>
</hibernate-mapping>
测试代码:
static void add(){ Person p = new Person(); p.setName("person"); p.setAge(22); Worker worker = new Worker(); worker.setName("worker"); worker.setAge(30); worker.setWork_year(11); Farmer farmer = new Farmer(); farmer.setName("farmer"); farmer.setAge(31); farmer.setFarm_name("little candy"); Session s = HibernateUtil.getSession(); Transaction tx = s.beginTransaction(); s.save(p); s.save(worker); s.save(farmer); tx.commit(); }
执行报出异常:
org.hibernate.DuplicateMappingException: duplicate import: Person refers to both hibernate.extend.Person and hibernatetest01.Person (try using auto-import="false")
检查后发现,在hibernaqte.cfg.xml配置文件中,我在以前写一对一关系映射时,曾经用到过Person类。
<mapping resource="hibernatetest01/person.hbm.xml"/>
<mapping resource="hibernate/extend/person.hbm.xml"/>
异常也显示说我重复映射。并提示我使用auto-import属性。
修改映射文件:
<?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"/> //这一列对对象模型没有作用,是hibernate用来区分具体的子类用的
<property name="name"/>
<property name="age"/>
<subclass name="Worker" discriminator-value="1">
<property name="work_year"/>
</subclass>
<subclass name="Farmer" discriminator-value="2">
<property name="farm_name"/>
</subclass>
</class>
</hibernate-mapping>
修改后,问题得到解决。执行以上程序代码,显示的sql语句为:
Hibernate: insert into person (name, age, work_year, type) values (?, ?, ?, 1)
Hibernate: insert into person (name, age, farm_name, type) values (?, ?, ?, 2)
查看数据库的表结构为:
+----+------+--------+------+----------------+--------------+
| id | type | name | age | work_year | farm_name|
+----+------+----------+-----+--------------+--------------+
| 1 | 0 | person | 22 | NULL | NULL |
| 2 | 1 | worker | 30 | 11 | NULL |
| 3 | 2 | farmer | 31 | NULL | little candy|
+----+------+----------+------+---------------+-------------+
由上面可见:work_year和farm_name属性必须是可以为null的。不然第一条插入语句就会出现问题。这也是这种方法的一种局限。表中有冗余字段。表结构不是很合理。同时,在类体系结构上增加新的子类时,要对数据库表的结构做修改,也使得不是很方便。
这种方案,由于对类体系的操作归结为对一张表的操作,在性能上有一定的优势。
充:
auto-import (可选 - 默认为 true): 指定是否我们可以在查询语言中使用非全限定的类名(仅限于本映射文件中的类)。
假若你有两个持久化类,它们的非全限定名是一样的(就是在不同的包里面),你应该设置auto-import="false"。假若说你把一个“import过”的名字同时对应两个类, Hibernate会抛出一个异常。
发表评论
-
hibernate学习之十八篇
2009-03-16 17:27 804hibernate不适合的场景: 1,不适合OLAP(on- ... -
hibernate学习之十七篇
2009-03-16 12:31 989零碎知识小结: ◆数据类型: 1,<propert ... -
PO and POJO
2009-03-11 23:49 819原文:http://danni505.blog.51cto.c ... -
hibernate学习之第十六篇
2009-03-11 21:36 1469session context和事务边界 用current_ ... -
hibernate学习之第十五篇
2009-03-11 21:33 1026事务与事务边界 hibernat ... -
Hibernate二级缓存攻略(转)
2009-03-09 22:56 840Hibernate二级缓存攻略(转) 很多人对二级缓存都不太 ... -
hibernate学习之第十四篇
2009-03-09 17:48 1154hibernate的内部缓存 hibernate的缓存分为 ... -
hibernate学习之第十三篇
2009-03-09 17:41 1007load方法的懒加载及原理分析 懒加载的目的,减少不必要的数 ... -
hibernate学习之第十二篇(续)
2009-03-06 19:10 985《四》每个具体类映射 ... -
hibernate学习之第十二篇
2009-03-06 15:57 938《三》混合使用“一个 ... -
hibernate学习之第十一篇(2)
2009-03-05 23:00 891《二》每个子类映射到一张表(joined-subclass) ... -
hibernate学习之第十篇
2009-03-05 13:53 1108级联和关系维护 Cascade 用来说明当对主对象进行某种操 ... -
hibernate学习之第九篇
2009-03-04 22:52 1337hibernate中的集合类型 引入: Hibernate ... -
hibernate学习之第八篇
2009-03-03 22:11 990组件映射 关联的属性是个复杂类型的持久化类,但不是实体即: ... -
hibernat学习之第七篇
2009-03-03 13:06 944多对多关联关系的映射 在操作和性能方面都不太理想,所以多对 ... -
hibernate 学习之第六篇
2009-03-02 20:31 902基于主键的一对一关联 Person类和IdCard,一对一 ... -
深入浅出hibernate摘录2
2009-03-02 00:38 1504以下内容摘自深入浅出hibernate 在编写代码的时候,尽 ... -
深入浅出hibernate摘录
2009-03-01 19:45 1228以下摘自深入浅出hiberna ... -
hibernate学习之第五篇
2009-03-01 19:43 10731, oracle数据库中,user是关键字,如果用户的表名为 ... -
hibernate学习之第四篇(对象状态)
2009-03-01 19:38 1075session 的几个主要方法 ...
相关推荐
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`...
1. **源码** - Hibernate 是一个开源项目,其源代码可供开发者研究和学习,理解其内部工作原理,包括对象持久化、缓存机制、事务管理等核心功能。 2. **工具** - 作为开发工具,Hibernate 提供了丰富的 API 和配置...
1. **对象关系映射(ORM)**:ORM是Hibernate的核心,它提供了一种方式,将Java对象模型与数据库表结构进行对应,使得开发者可以在Java对象层面上操作数据,而无需关心底层的SQL语法。 2. **配置与实体类**:在...
十、第一级缓存与第二级缓存 第一级缓存是Session级别的,每次操作的对象都会被放入缓存,提高读写速度。第二级缓存是SessionFactory级别的,可以跨Session共享,通常用于缓存不经常改变的数据。 以上是对...