Hibernate 的继承映射体系提供了一个OO方式的建模方法,有时为了解决复杂的对象关系,用继承映射可以以OO的方式优雅的设计表,操作POJO,为了不混乱,在使用时清晰的选择表关联方式,特做笔记。
方式1: 对一个继承体系,只用一个表保存数据
说明 : 这种方式下,POJO仍然用继承的方式表述,但数据库里只用一个表来保存所有继承体系中的表数据
hibernate 用一个鉴别器字段来区分数据属于那个POJO,每个POJO的鉴别器值在该体系中应该是唯一的,你在每个子类中生命子类的属性,在父类中声明的公用字段,而所有子类中的持久化属性都将作为这个表的一个列.
父类:Panel
package org.jackysoft.entity;
import java.io.Serializable;
import javax.persistence.*;
import org.hibernate.annotations.GenericGenerator;
@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(
name="planetype",
discriminatorType=DiscriminatorType.STRING
)
@DiscriminatorValue("Plane")
public class Plane implements Serializable {
/**
*
*/
private static final long serialVersionUID = 4901135581088517395L;
@Id
@GeneratedValue(generator="system-hilo")
@GenericGenerator(name="system-hilo", strategy = "hilo")
private int id;
public void setId(int id) {
this.id = id;
}
public int getId() {
return id;
}
}
两个子类:
package org.jackysoft.entity;
import javax.persistence.*;
@Entity
@DiscriminatorValue("A320")
public class A320 extends Plane {
/**
*
*/
private static final long serialVersionUID = 443224501993619616L;
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
package org.jackysoft.entity;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
@Entity
@DiscriminatorValue("B320")
public class B320 extends Plane {
/**
*
*/
private static final long serialVersionUID = -1769971860887308527L;
private String bName;
public void setbName(String bName) {
this.bName = bName;
}
public String getbName() {
return bName;
}
}
生成的数据库表DDL
CREATE TABLE `plane` (
`planetype` varchar(31) NOT NULL,
`id` int(11) NOT NULL,
`name` varchar(255) DEFAULT NULL,
`bName` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
)
数据库表内容
方式2: 连接子类策略
说明:父子类之间不需要鉴别器类识别,父类申明的属性放在父类表中,子类的属性放在子类表中,当查询子类时用内连接的方法取出父类和子类属性,生成子类的POJO
这种情况下,各自保存各自的属性.父子类之间关联通过外键关系类维持
父类:
package org.jackysoft.entity;
import java.io.Serializable;
import java.util.Calendar;
import javax.persistence.*;
import org.hibernate.annotations.GenericGenerator;
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Cat implements Serializable {
/**
*
*/
private static final long serialVersionUID = 8293438353402096985L;
private String id;
private Calendar birthday;
@Id
@GeneratedValue(generator = "cat-uuid")
@GenericGenerator(name = "cat-uuid", strategy = "uuid")
String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public void setBirthday(Calendar birthday) {
this.birthday = birthday;
}
public Calendar getBirthday() {
return birthday;
}
}
package org.jackysoft.entity;
import javax.persistence.Entity;
import javax.persistence.PrimaryKeyJoinColumn;
@Entity
@PrimaryKeyJoinColumn(name = "CAT")
public class DomesticCat extends Cat {
/**
*
*/
private static final long serialVersionUID = 8576737344166525594L;
private String name;
private int age;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
}
DDL:
CREATE TABLE `cat` (
`id` varchar(255) NOT NULL,
`birthday` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
)
CREATE TABLE `domesticcat` (
`name` varchar(255) DEFAULT NULL,
`CAT` varchar(255) NOT NULL,
`age` int(11) NOT NULL,
PRIMARY KEY (`CAT`),
KEY `FK24E5F1B81C0CC455` (`CAT`),
CONSTRAINT `FK24E5F1B81C0CC455` FOREIGN KEY (`CAT`) REFERENCES `cat` (`id`)
)
插入一条数据后
方法3:每个具体类一张表
说明:这种情况下,每个具体类映射一张表,而每个表保存这个类的所有持久化属性,当然这时也包括从父类继承过来的属 性,其实诚如官方所言,和单独映射每个类都一样,可是如果你为了使用对象见的OO多态属性可以这么映射
@Entity @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class Flight implements Serializable { ... }
- 大小: 23.3 KB
- 大小: 31.3 KB
- 大小: 27.2 KB
分享到:
相关推荐
通过元数据(如XML或注解),开发者可以定义对象类和数据库表之间的映射关系,包括基本类型的字段对应表的列,类的属性与表的外键,以及1:1、1:n、n:m的关联关系和继承结构。 【二、Hibernate入门】 Hibernate是一...
9. **继承映射**:支持单表继承、联合继承和表-per-hierarchy等多种策略,使得Java类的继承关系能够自然地映射到数据库中。 10. **懒加载和立即加载**:Hibernate允许我们选择性地加载关联的对象,提高性能。 11. ...
《Hibernate Annotation 学习笔记》 在Java的持久化框架中,Hibernate以其强大的功能和易用性成为开发者首选之一。而Hibernate Annotation则是Hibernate提供的一种基于注解的实体映射方式,它极大地简化了传统XML...
3. **继承映射:** Hibernate 支持单表继承、联合继承和表格-per-class继承策略。 **四、操作数据库** 1. **CRUD 操作:** Hibernate 提供了简便的方法进行创建(save()或persist())、读取(get()或load())、更新...
2016年版本的Hibernate在继承了其早期版本的优秀特性基础上,又进行了一些改进和优化,使得其更加适合现代应用程序的需求。 首先,我们需要理解Hibernate的核心概念——对象关系映射(ORM)。ORM是将数据库中的表...
#### 九、继承映射 - **类型**: - 单表继承:多个子类共享一张表。 - 每个子类一张表:每个子类都有单独的表。 - 分级表继承:使用一个主表和多个扩展表。 #### 十、集合映射 - **类型**: - `Set`:无序不...
- **多表继承映射关系**:`多表继承映射关系.PNG` 可能涵盖了Hibernate的联合继承和表-per-hierarchy策略,其中每个子类对应单独的表或共享一部分字段。 **4. 映射类型** `其他映射(set,list,string,map)-3.PNG` ...
### Hibernate实战笔记——深入解析对象关系映射与优化策略 #### 一、对象关系映射(ORM)概念 - **什么是持久化**:在计算机科学领域,“持久化”指的是将程序的数据状态保存到非易失性的存储介质中,以便可以在...
继承关联映射允许在数据库表中存储继承关系,而component映射用于将复杂的对象分解成多个简单的组件存储。复合主键关联映射则是处理具有多个字段作为主键的表与对象之间的映射。 通过理解这些知识点,开发者可以更...
- **映射机制**:包括基础映射(类与表的映射)、继承映射(单表继承、多表继承)、组件映射(对象内部结构的映射)以及集合映射(一对多、多对一、多对多等关系的映射)。 3. **HQL查询**: - Hibernate Query ...
总的来说,这篇 Hibernate 学习笔记涵盖了关联关系的多种类型和映射方法,以及查询排序、组件映射和继承映射等核心概念,为理解并熟练运用 Hibernate 提供了坚实的基础。通过实际编码和理解这些示例,开发者可以更...
【hibernate4框架学习笔记】 Hibernate是一款强大的ORM(Object-Relational Mapping)框架,它在Java开发中扮演着至关重要的角色,通过提供对象与数据库之间的映射,解决了对象模型和关系模型之间的“阻抗不匹配”...
12. **继承映射**:Hibernate支持单表继承、联合继承和表格-per-class继承策略,学习者应了解每种策略的适用场景。 通过本教程的逐日学习,包括`day01`至`day07`的笔记内容,以及可能包含代码示例的`day03.txt`、`...
### hibernate-note学习笔记知识点详解 #### 一、对象持久化 **1.1 概述** 对象持久化是指将程序中的对象状态保存到非易失性存储中(如硬盘或磁盘等),以便在系统重启后仍能保留这些状态。这种技术常用于将对象的...
【强人Hibernate文档笔记】是针对Hibernate框架的深入学习资料,涵盖了对象定义、实例状态、JMX集成和JCA支持等关键概念。以下是对这些内容的详细解释: **一、对象定义** 1. **SessionFactory**: SessionFactory是...
9. **继承映射**:介绍了如何处理Java类的继承关系并映射到数据库,如单表继承、联合继承和表-per-hierarchy映射。 10. **实体状态和生命周期**:讲解了Hibernate如何管理对象的状态(瞬时、持久、托管和脱管),...
Struts是基于MVC(Model-View-Controller)架构模式的Web应用框架,而Hibernate是一个对象关系映射(ORM)框架,用于简化数据库操作。 **Struts框架** Struts1是Apache软件基金会下的一个项目,它为Java EE应用程序...