- 浏览: 1240306 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (718)
- HTML (13)
- JS基础 (23)
- JS应用 (40)
- AJAX (6)
- JSP相关 (12)
- JAVA基础 (52)
- JAVA应用 (74)
- APPLET (11)
- SWING\RCP (2)
- JAVA反射 (6)
- 设计模式 (26)
- 数据库设计 (20)
- Struts (35)
- Struts2 (12)
- Spring (22)
- Hibernate (45)
- Ibatis (18)
- mybatis (3)
- SSH (8)
- UML (5)
- WebService (3)
- XML (16)
- Log4j (7)
- WEB容器 (26)
- 数据结构 (36)
- Linux (34)
- Ruby on Rails (1)
- 其它技术 (27)
- IDE配置 (15)
- 项目实战 (2)
- Oracle (69)
- JAVA报表 (7)
- Android学习 (2)
- 博客链接 (1)
- 网络基础 (1)
- WEB集群 (1)
- .Net开发 (11)
- PB (4)
- 系统构建 (15)
最新评论
-
jnjeC:
牛逼啊哥们,讲得太好了
Maven仓库理解、如何引入本地包、Maven多种方式打可执行jar包 -
九尾狐的yi巴:
很好 感谢!
Itext中文处理(更新版) -
luweifeng1983:
有用的,重启一下嘛。
设置eclipse外部修改文件后自动刷新 -
Master-Gao:
设置了也不管用,怎么破呢?
设置eclipse外部修改文件后自动刷新 -
aigo_h:
锋子还有时间写博客,还是很闲哈!
Add directory entries问题
每个具体类一张表
我们看看这种配置需要怎么做?
Hibernate继承映射的第一种策略:每个具体类一张表 1、如何映射 这种策略是使用union-subclass标签来定义子类的。每个子类对应一张表,而且这个表的信息是完备的, 即包含了所有从父类继承下来的属性映射的字段(这就是它跟joined-subclass的不同之处,joined-subclass定义的子类的表, 只包含子类特有属性映射的字段)。实现这种策略的时候,有如下步骤: 父类用普通<class>标签定义即可 子类用<union-subclass>标签定义,在定义union-subclass的时候,需要注意如下几点: Union-subclass标签不再需要包含key标签(与joined-subclass不同) Union-subclass标签,既可以被class标签所包含(这种包含关系正是表明了类之间的继承关系), 也可以与class标签平行。 当Union-subclass标签的定义与class标签平行的时候,需要在Union-subclass标签中,添加extends属性,里面的值是父类的全路径名称。 子类的其它属性,像普通类一样,定义在Union-subclass标签的内部。这个时候,虽然在union-subclass里面定义的只有子类的属性,但是因为它继承了父类,所以, 不需要定义其它的属性,在映射到数据库表的时候,依然包含了父类的所有属性的映射字段。 !!!特别注意:在保存对象的时候,id不能重复(所以不能用自增方法生成主键) 2、存储和多态查询参见策略一:每棵类继承树对应一张表
这里我们将Animal定义为抽象类:
package com.lwf.hibernate.extend1; //public class Animal { //public class Animal { //第三种策略的时候设为abstract来测试 public abstract class Animal { private int id; private String name; private boolean sex; 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; } public boolean isSex() { return sex; } public void setSex(boolean sex) { this.sex = sex; } }
其它类相同.
映射文件:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.lwf.hibernate.extend1"> <class name="Animal" abstract="true"> <id name="id"> <generator class="assigned"/> </id> <property name="name"/> <property name="sex"/> <union-subclass name="Pig" table="t_pig"> <property name="weight"/> </union-subclass> <union-subclass name="Bird" table="t_bird"> <property name="height"/> </union-subclass> </class> </hibernate-mapping>
注意文件中使用了,union-subclass,并且没有了key属性.
而且Animal的主键生成策略变成了assigned.
所以跟着我们的测试文件的save数据方法也要变.
测试类:
package com.lwf.hibernate.test; import java.util.Iterator; import java.util.List; import junit.framework.TestCase; import org.hibernate.Session; import com.lwf.hibernate.extend1.Animal; import com.lwf.hibernate.extend1.Bird; import com.lwf.hibernate.extend1.Pig; import com.lwf.hibernate.util.HibernateUtils; public class Ext3Test extends TestCase { /** * 保存数据 * */ public void testSaveAnimal() { Session session = null; try { session = HibernateUtils.getSession(); session.beginTransaction(); Pig p = new Pig(); p.setId(1); p.setName("猪1"); p.setSex(true); p.setWeight(400); Bird b = new Bird(); b.setId(2); b.setName("孔雀"); b.setSex(true); b.setHeight(100); session.save(p); session.save(b); session.getTransaction().commit(); }catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); }finally { HibernateUtils.closeSession(session); } } /** * 通过Pig类来装载 * */ public void testLoad1() { Session session = null; try { session = HibernateUtils.getSession(); Pig p = (Pig)session.load(Pig.class, 1); System.out.println("name=" + p.getName()); }catch(Exception e) { e.printStackTrace(); }finally { HibernateUtils.closeSession(session); } } /** * 通过Animal类来装载 * */ public void testLoad2() { Session session = null; try { session = HibernateUtils.getSession(); Animal a = (Animal)session.load(Animal.class, 1); System.out.println("name=" + a.getName()); }catch(Exception e) { e.printStackTrace(); }finally { HibernateUtils.closeSession(session); } } public void testLoad3() { Session session = null; try { session = HibernateUtils.getSession(); Animal a = (Animal)session.load(Animal.class, 1); //因为我们load默认是Lazy,因为Lazy所以我们看到的是Animal的代理类 //所以通过instance是具体反映不出真正的对象类型的 if (a instanceof Pig) { System.out.println("name=" + a.getName()); }else { System.out.println("不是猪!"); } }catch(Exception e) { e.printStackTrace(); }finally { HibernateUtils.closeSession(session); } } public void testLoad4() { Session session = null; try { session = HibernateUtils.getSession(); Animal a = (Animal)session.get(Animal.class, 1); //可以正确判断,因为Animal不是代理类 if (a instanceof Pig) { System.out.println("name=" + a.getName()); }else { System.out.println("不是猪!"); } }catch(Exception e) { e.printStackTrace(); }finally { HibernateUtils.closeSession(session); } } /** * 将Animal的lazy设置为false * */ public void testLoad5() { Session session = null; try { session = HibernateUtils.getSession(); Animal a = (Animal)session.load(Animal.class, 1); if (a instanceof Pig) { System.out.println("name=" + a.getName()); }else { System.out.println("不是猪!"); } }catch(Exception e) { e.printStackTrace(); }finally { HibernateUtils.closeSession(session); } } public void testLoad6() { Session session = null; try { session = HibernateUtils.getSession(); /** * 多态查询 */ List animalList = session.createQuery("from Animal").list(); for (Iterator iter = animalList.iterator(); iter.hasNext(); ) { Animal a = (Animal)iter.next(); System.out.println("name=" + a.getName()); } }catch(Exception e) { e.printStackTrace(); }finally { HibernateUtils.closeSession(session); } } }
我们看看创建的表格:
mysql> desc t_bird; +--------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+--------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | | | | name | varchar(255) | YES | | NULL | | | sex | bit(1) | YES | | NULL | | | height | int(11) | YES | | NULL | | +--------+--------------+------+-----+---------+-------+ 4 rows in set (0.03 sec) mysql> desc t_pig; +--------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+--------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | | | | name | varchar(255) | YES | | NULL | | | sex | bit(1) | YES | | NULL | | | weight | int(11) | YES | | NULL | | +--------+--------------+------+-----+---------+-------+
你会发现因为父类为抽象类,所以并没有生成t_animal表,而子类中有了所有属性,生成的表中也有了所有的字段.这与前面二种策略是不同的.
发表评论
-
Hibernate抓取策略二
2010-05-11 17:56 1085在Classes与Student一对多映射中,我们将Set里面 ... -
Hibernate抓取策略一
2010-05-11 16:29 1323抓取策略指多表关联查询的时候,Hibernate会发出多条sq ... -
Hibernate查询缓存
2010-05-11 01:15 1618二级缓存中,如果不设置“查询缓存”,那么hibernate只会 ... -
Hibernate所需完整类库
2010-05-11 01:08 892附件为最新配置Hibernate所需的包. 由来: 一、下 ... -
Hibernate 二级缓存缺少包出现的异常
2010-05-10 23:29 2338由于二级缓存使用的包org.hibernate.cache.E ... -
转:Hibernate性能优化之二级缓存
2010-05-10 17:28 1142http://chenhongbin007.blog.163. ... -
Hibernate lazy加载FOR 单端关联
2010-05-10 00:54 1324Hibernate单端关联懒加载策略:即在<one-to ... -
Hibernate lazy加载FOR Connection
2010-05-10 00:28 1199Hibernate集合属性的懒加载策略: 在集合属性上, ... -
Hibernate lazy加载FOR Class
2010-05-09 23:51 1057lazy策略可以用在: * <class>标签 ... -
Hibernate性能优化:二级缓存
2010-05-06 16:48 1070hibernate二级缓存 定义步骤: 1、打开缓存, ... -
Hibernate性能优化:一级缓存
2010-05-06 16:33 1126一级缓存与session周期一致,二级缓存与sessionFa ... -
Hibernate悲观锁与乐观锁及事务管理机制
2010-05-06 11:57 1197引用: 悲观锁与乐观锁: http://www.iteye ... -
Hibernate学习笔记博客
2010-05-06 11:32 725网上也有人自学hibernate的笔记 http://hi. ... -
Hibernate与EJB的区别
2010-05-05 18:09 878Hibernate不支持分布式应用 -
Hibernate对象状态
2010-05-05 17:48 1775Hibernate对象有三种状态: 瞬时状态(Transie ... -
Hibernate HQL示例十二:DML更新、删除及与Hibernate持久化更新
2010-05-05 16:42 1977DML更新及删除 示例: package com.bjsx ... -
Hibernate HQL示例十一:分页查询
2010-05-05 16:21 1142分页查询: select * from t_student ... -
Hibernate HQL示例十:统计查询
2010-05-05 15:57 2114统计函数的使用 count(*) 等 package co ... -
Hibernate HQL示例九:连接查询
2010-05-05 15:38 3539inner join left out join rig ... -
Hibernate HQL示例八:查询对象导航及Implicit Join
2010-05-05 10:32 1689通过Student对象导航到class对象的id 如下: ...
相关推荐
总结来说,“每个子类一张表”的继承映射策略是Hibernate提供的一种处理继承关系的方法,它将类的继承结构映射到数据库的多个表中。这种策略适合于子类具有大量特有属性的情况,但需要权衡可能带来的数据库设计复杂...
本篇文章主要探讨的是Hibernate的继承映射策略,特别是“每个类分层结构一张表”(Table per Concrete Class)的方式。这种映射策略是Hibernate提供的多种继承映射方案之一,适用于处理复杂的对象模型。 首先,我们...
本篇文章将详细探讨Hibernate继承映射的策略,特别是“每个具体类一张表”(Table Per Concrete Class)的映射方式。 在面向对象编程中,继承是常见的代码复用手段,但在关系型数据库中,这种概念并不直接对应。...
本文将详细探讨“Hibernate继承映射的第一种策略:每个类对应一张表”的概念、实现方式以及其优缺点。 首先,我们需要理解Hibernate继承映射的基本策略。在面向对象编程中,类继承是常见的代码复用手段,但在数据库...
本篇将详细介绍Hibernate继承映射的第一种策略——每棵类继承树对应一张表,即单一表继承策略。 ### 单一表继承策略 在单一表继承策略中,所有类层次结构中的实例都存储在同一张数据库表中。这种策略通过在表中...
4. 分层继承:与表 per 类类似,每个类都有自己的表,但只有实体类有自己的表,抽象类不对应任何表。这适用于抽象类中没有字段的情况。 C3P0是另一个重要的知识点,它是开源的JDBC连接池,用于管理数据库连接。连接...
总结起来,"每个类都对应一张表"的继承映射策略在Hibernate中是一种直接且易于理解的方法,适合那些每个类都有独特属性的情况。然而,它可能不适合所有场景,特别是当子类众多或者需要减少数据冗余时。在实际应用中...
Hibernate的继承映射 --每个继承层次一张表 -- 每个具体类一张表 -- 每个类一张表
第三种映射方式是**类表映射**(Class-Table Inheritance Mapping),其中继承关系树的每个类(包括抽象类)都有其对应的表。这需要使用外键来建立类之间的关系。 ##### 14.3.1 创建映射文件 `Employee`类的映射文件...
本主题将深入探讨“继承”这一概念在Hibernate中的应用,如何在具体类与数据库表之间建立映射关系。这对于我们理解如何设计高效、灵活的数据库模型至关重要。 标题中的“17 继承(四)每一个具体的类 映射到一张表”...
《Hibernate继承映射详解》 Hibernate,作为Java领域中的一款著名对象关系映射(ORM)框架,极大地简化了数据库操作。在实际项目中,我们常常会遇到类的继承关系,而Hibernate提供了强大的支持来处理这种继承关系的...
《Hibernate继承映射详解》 在Java开发中,对象关系映射(ORM)框架如Hibernate大大简化了数据库操作。Hibernate不仅提供了对基本数据类型的映射,还支持复杂的数据结构,如继承关系的映射。本篇文章将深入探讨...
**标题:“Hibernate继承映射(Annotation)详解”** 在Java持久化框架Hibernate中,继承映射是一种关键特性,它允许开发者将对象模型的继承结构映射到数据库的表结构。在使用注解的方式进行配置时,这个过程变得更加...