- 浏览: 115146 次
- 性别:
- 来自: 上海
文章分类
最新评论
继承映射的三种策略:
* 单表继承,每棵类继承树使用一个表
* 具体表继承,每个子类一个表
* 类表继承,每个具体类一个表
-----------------------------------------------------------------
每棵类继承树映射成一张表
1、理解如何映射
因为类继承树肯定是对应多个类,要把多个类的信息存放在一张表中,必须有某种机制来区分哪些记录是属于哪个类的。
这种机制就是,在表中添加一个字段,用这个字段的值来进行区分。用hibernate实现这种策略的时候,有如下步骤:
父类用普通的<class>标签定义
在父类中定义一个discriminator,即指定这个区分的字段的名称和类型
如:<discriminator column=”XXX” type=”string”/>
子类使用<subclass>标签定义,在定义subclass的时候,需要注意如下几点:
Subclass标签的name属性是子类的全路径名
在Subclass标签中,用discriminator-value属性来标明本子类的discriminator字段(用来区分不同类的字段)
的值Subclass标签,既可以被class标签所包含(这种包含关系正是表明了类之间的继承关系),也可以与class标
签平行。 当subclass标签的定义与class标签平行的时候,需要在subclass标签中,添加extends属性,里面的值
是父类的全路径名称。子类的其它属性,像普通类一样,定义在subclass标签的内部。
2、理解如何存储
存储的时候hibernate会自动将鉴别字段值插入到数据库中,在加载数据的时候,hibernate能根据这个鉴别值
正确的加载对象
多态查询:在hibernate加载数据的时候能鉴别出正真的类型(instanceOf)
* get支持多态查询
* load只有在将<class>标签的lazy=false,才支持多态查询
* hql支持多态查询
Animal: Bird extends Animal: Pig extends Animal:
private int id; private int height; private int weight;
private String name;
-->
<class name="Animal" table="t_animal">
<id name="id">
<generator class="native"/>
</id>
<discriminator column="type" type="string"/><!--必须在id后面,是检别器 -->
<property name="name"/>
//subclass表示子类,discriminator-value表示检别字段的值
<subclass name="Pig" discriminator-value="P">
<property name="weight"/>
</subclass>
<subclass name="Bird" discriminator-value="B">
<property name="height"/>
</subclass>
</class>
Session session=null;
try{
session=HibernateUtils.getSession();
session.beginTransaction();
Pig pig=new Pig();
pig.setName("猪八戒");
pig.setWeight(100);
session.save(pig);
Bird bird=new Bird();
bird.setName("鸟类");
bird.setHeight(50);
session.save(bird);
session.getTransaction().commit();
}catch(Exception e){
e.printStackTrace();
session.getTransaction().rollback();
}finally{
HibernateUtils.closeSession(session);
}
}
public void testLoda1(){
Session session=null;
try{
session=HibernateUtils.getSession();
session.beginTransaction();
Pig p=(Pig)session.load(Pig.class, 1);
System.out.println(p.getName());
session.getTransaction().commit();
}catch(Exception e){
e.printStackTrace();
session.getTransaction().rollback();
}finally{
HibernateUtils.closeSession(session);
}
}
public void testLoda2(){
Session session=null;
try{
session=HibernateUtils.getSession();
session.beginTransaction();
Animal a=(Animal)session.load(Animal.class, 1);
System.out.println(a.getName());
session.getTransaction().commit();
}catch(Exception e){
e.printStackTrace();
session.getTransaction().rollback();
}finally{
HibernateUtils.closeSession(session);
}
}
public void testLoda3(){
Session session=null;
try{
session=HibernateUtils.getSession();
session.beginTransaction();
Animal a=(Animal)session.load(Animal.class, 1);
//因为load默认支持lazy,我们看到的是Animal的代理对象
//所以通过instanceof是反应不出正真的对象类型的
//因些load在默认情况下是不支持多态查询的
if(a instanceof Pig){
System.out.println(a.getName());
}else{
System.out.println("不是");
}
session.getTransaction().commit();
}catch(Exception e){
e.printStackTrace();
session.getTransaction().rollback();
}finally{
HibernateUtils.closeSession(session);
}
}
每个子类映射成一张表
1、理解如何映射
这种策略是使用joined-subclass标签来定义子类的。父类、子类,每个类都对应一张数据库表。
在父类对应的数据库表中,实际上会存储所有的记录,包括父类和子类的记录;在子类对应的数据库表中,
这个表只定义了子类中所特有的属性映射的字段。子类与父类,通过相同的主键值来关联。实现这种策略的时候,
有如下步骤:
父类用普通的<class>标签定义即可
父类不再需要定义discriminator字段
子类用<joined-subclass>标签定义,在定义joined-subclass的时候,需要注意如下几点:
Joined-subclass标签的name属性是子类的全路径名
Joined-subclass标签需要包含一个key标签,这个标签指定了子类和父类之间是通过哪个字段来关联的。
如:<key column=”PARENT_KEY_ID”/>,这里的column,实际上就是父类的主键对应的映射字段名称。
Joined-subclass标签,既可以被class标签所包含(这种包含关系正是表明了类之间的继承关系),
也可以与class标签平行。 当Joined-subclass标签的定义与class标签平行的时候,需要在Joined-subclass
标签中,添加extends属性,里面的值是父类的全路径名称。子类的其它属性,像普通类一样,定义在joined-subclass标签的内部。
Animal: Bird extends Animal: Pig extends Animal:
private int id; private int height; private int weight;
private String name;
-->
<class name="Animal" table="t_animal2">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<joined-subclass name="Pig" table="t_pag2">
<key column="pagid"/>
<property name="weight"/>
</joined-subclass>
<joined-subclass name="Bird" table="t_bird2">
<key column="birdid"/>
<property name="height"/>
</joined-subclass>
</class>
每个具体类映射成一张表
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是不能重复的(不能使用自增生成主键)
默认父类的animal表会生成,设<class>的abstract="true"就不会生成
Animal: Bird extends Animal: Pig extends Animal:
private int id; private int height; private int weight;
private String name;
-->
<class name="Animal" abstract="true">
<id name="id">
<generator class="assigned"/>
</id>
<property name="name"/>
<union-subclass name="Pig" table="t_pig3">
<property name="weight"/>
</union-subclass>
<union-subclass name="Bird" table="t_bird3">
<property name="height"/>
</union-subclass>
</class>
发表评论
-
hibernate基础-初步
2009-11-03 15:26 625类拟框架:Apache OJB,JDO,Toplink,EJB ... -
hibernate基础-基本映谢标签和属性
2009-11-03 15:35 663hibernate基本映射 实体类------>表 实体 ... -
hibernate基础-映射关系(多对一I一对一)
2009-11-03 15:53 496多对一关联映射 many-to-one关联映射本质: * ... -
hibernate基础-映射关系(一对多I多对多).
2009-11-03 16:04 599一对多关联映射(one-to-many) 一对多关联映射利用了 ... -
hibernate基础-其他映射
2009-11-03 16:17 665set、list、array、map Collection: ... -
hibernate基础-自关联映射
2009-11-03 16:19 7521 class Node: private int id;pr ... -
hibernate基础-Component+[联合]映象
2009-11-03 16:22 507Component映射(值对象映射) 在hibernate中, ... -
hibernate基础-lazy策略
2009-11-03 16:33 789lazy策略可以使用在: * <class> ... -
hibernate基础-fetch抓取
2009-11-03 16:34 589抓取策略(单端代理的批量抓取) 1 保持默认,也就是fetch ... -
hibernate基础-Session_Flush
2009-11-03 16:37 694session flush测试: session ... -
hibernate基础-悲观[乐观]锁
2009-11-03 16:40 493悲观锁 悲观锁的实现,通常依赖于数据库机制,在整个过程中将数据 ... -
hiberante基出-缓存
2009-11-03 16:49 500一级缓存 * 一级缓存是缓存实体对象的 * 如果管理一 ... -
hibernate基础-HQL
2009-11-03 17:14 536在hql中关键字不区分大小写,但是属性和类名区分大不写简单属性 ... -
hibernate基础-HibernateTemplate
2009-11-03 17:20 5731 ,void delete ( Object entity ... -
[导入]Hibernate 深入研究之 Criteria
2009-11-03 17:35 565文章来源:http://www.cnblogs.com/ ... -
DetachedCriteria
2009-11-03 17:41 658org.hibernate.criterion.Detache ... -
Restrictions
2009-11-03 17:46 727HQL运算符 ... -
hibernate.cfg.xml
2009-11-03 17:56 611<?xml version="1.0&quo ... -
由映射文件生成表
2009-11-03 17:57 555import org.hibernate.cfg.Confi ... -
JNDI连接池
2009-11-29 21:19 723管理连接对象 Modle:biz,dao,entity 数据源 ...
相关推荐
- **Hiberante的对象继承关系之--TPC一个类一张表.doc**:讲述Hibernate处理对象继承和多表映射的方法。 - **hibernate 非主键自增.doc**:关于非主键字段如何实现自动增长的策略。 - **Struts和Hibernate之间搭起...
在Java的持久化框架中,Hibernate是一个非常流行的ORM(对象关系映射)工具,它允许开发者将数据库操作转化为对Java对象的操作。DAO(Data Access Object)层是软件设计模式中的一个重要概念,主要用于处理数据访问...
- **继承映射**:支持不同类型的继承映射策略,如单表继承、类表继承等。 #### 事务管理 Hibernate 支持本地事务和分布式事务,并且可以通过配置来控制事务的传播行为。 ### 实际应用场景 - **企业级应用开发**...
- `@Inheritance`: 控制实体类继承时的表策略,如单表继承、独立表继承等。 - `@Transient`: 标记不持久化的属性。 4. **持久化类的创建** 使用Hibernate注解,开发者可以在Java类上直接标注数据库相关的元数据...
9. **多态性支持**:Hibernate 支持多态查询,允许查询返回不同类的实例,这在处理继承关系时非常有用。 10. **一对多、一对一、多对多关联映射**:Hibernate 3.2 提供了对这些关系映射的完整支持,开发者可以通过...
10. **实体关系映射策略**:了解不同的映射策略,如表继承、集合映射等。 通过完成这个作业,学员不仅能够掌握Hibernate的基本用法,还能了解到如何在实际项目中有效利用ORM工具,提高开发效率。
前者包含了JPA和Hiberante,后者则提供了Spring Web MVC框架。 ```xml <groupId>org.springframework.boot <artifactId>spring-boot-starter-data-jpa <groupId>org.springframework.boot <artifactId>...
通过阅读《Hibernate参考文档》,开发者不仅可以掌握Hibernate的基础用法,还能深入了解其内部工作原理,从而在实际项目中更加灵活、高效地应用。配合提供的`说明.html`,可以帮助读者更好地理解和使用这份文档,...
JavaFX是用于创建桌面应用的UI库,而JPA和Hibernate则提供了对象关系映射(ORM)功能,允许我们用Java对象直接操作数据库。在`pom.xml`文件中,你需要包含以下依赖: 1. **Spring Boot Starter Web**:这是Spring ...
“hibernate”是一个强大的ORM(对象关系映射)工具,能够自动处理数据库操作,使得开发者可以专注于业务逻辑,而不是数据库细节。 “j2ee”和“j2se”是Java平台的两个主要版本。J2EE(现在被称为Java EE)是用于...