`
zhuchengzzcc
  • 浏览: 441790 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JPA 继承方式

    博客分类:
  • java
JPA 
阅读更多

    在JPA中,实体继承关系的映射策略共有三种:单表继承策略(table per class)、Joined策略(table per subclass)和Table_PER_Class策略。

 

1.单表继承策略

   

    单表继承策略,父类实体和子类实体共用一张数据库表,在表中通过一列辨别字段来区别不同类别的实体。具体做法如下:

a.在父类实体的@Entity注解下添加如下的注解:

@Inheritance(Strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name=”辨别字段列名”)
@DiscriminatorValue(父类实体辨别字段列值)

 

b.子类实体的@Entity注解下添加如下的注解:

@DiscriminatorValue(子类实体辨别字段列值) 

 

 

定义了一个父类

 

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@Table(name = "WINDOW_FILE")
@DiscriminatorColumn(name = "DISCRIMINATOR", discriminatorType = DiscriminatorType.STRING, length = 30)
@DiscriminatorValue("WindowFile")
public class WindowFile {

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	private Integer id;

	@Basic
	@Column(name = "NAME")
	private String name;

	@Basic
	@Column(name = "TYPE")
	private String type;

	@Basic
	@Column(name = "DATE")
	private Date date;
	//省略get set
}

 

后定义2个子类

 

@Entity
@DiscriminatorValue("Folder")
public class Folder extends WindowFile {

	@Basic
	@Column(name = "FILE_COUNT")
	private Integer fileCount;
	//省略get set
}

 

@Entity
@DiscriminatorValue("Document")
public class Document extends WindowFile {

	@Basic
	@Column(name = "SIZE")
	private String size;
	//省略get set
}

 

 以上通过列DISCRIMINATOR的不同,区分具体父子实体。

 

实际表结构如下:

WINDOW_FILE  DISCRIMINATOR,ID,NAME,DATE,TYPE,SIZE,FILE_COUNT

 

当你使用WindowFile实体时,实际表的字段为DISCRIMINATOR='WindowFile',SIZE与FILE_COUNT永远是空

当使用Folder实体时,DISCRIMINATOR='Folder',SIZE永远是空,FILE_COUNT为实际值。

Document同理,与Folder类似。

 

2.Joined策略

 

    父类实体和子类实体分别对应数据库中不同的表,子类实体的表中只存在其扩展的特殊属性,父类的公共属性保存在父类实体映射表中。具体做法:

 

 

 

@Inheritance(Strategy=InheritanceType.JOINED)

 

子类实体不需要特殊说明。

 

 

@Entity
@Table(name = "T_ANIMAL")
@Inheritance(strategy = InheritanceType.JOINED)
public class Animal {

	@Id
	@Column(name = "ID")
	@GeneratedValue(strategy = GenerationType.AUTO)
	private Integer id;

	@Column(name = "NAME")
	private String name;

	@Column(name = "COLOR")
	private String color;
	//省略get set
}

 

@Entity
@Table(name = "T_BIRD")
@PrimaryKeyJoinColumn(name = "BIRD_ID")
public class Bird extends Animal {

	@Column(name = "SPEED")
	private String speed;
	//省略get set
}

 

@Entity
@Table(name = "T_DOG")
@PrimaryKeyJoinColumn(name = "DOG_ID")
public class Dog extends Animal {

	@Column(name = "LEGS")
	private Integer legs;
	//省略get set
}

 

 

实际表结构如下:

T_ANIMAL  ID,COLOR,NAME

T_BIRD  SPEED,BIRD(既是外键,也是主键)

T_DOG  LEGS,DOG_ID(既是外键,也是主键)

 

3.Table_PER_Class策略

 

Table_PER_Class策略,父类实体和子类实体每个类分别对应一张数据库中的表,子类表中保存所有属性,包括从父类实体中继承的属性。具体做法:

只需在父类实体的@Entity注解下添加如下注解:

@Inheritance(Strategy=InheritanceType.TABLE_PER_CLASS)

 

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@Table(name = "T_VEHICLE")
public class Vehicle { // 基类

	@Id
	// @GeneratedValue
	@Column(name = "ID")
	private Integer id;

	@Column(name = "SPEED")
	private Integer speed;// 速度
	//省略get set
}

 

@Entity
@Table(name = "T_CAR")
public class Car extends Vehicle {

	@Column(name = "ENGINE")
	private String engine;// 发动机
	//省略get set
}

 

一旦使用这种策略就意味着你不能使用AUTO generator 和IDENTITY generator,即主键值不能采用数据库自动生成。

 

实际表结构如下:

T_VEHICLE  ID,SPEED

T_CAR  ID,SPEED,ENGINE

 

分享到:
评论

相关推荐

    使用jpa映射关联和继承

    **二、JPA继承映射** 1. **单一继承(Single Table Inheritance,STI)**:所有子类数据都存储在同一个表中,通过一个字段来区分不同的子类。使用`@Inheritance(strategy=InheritanceType.SINGLE_TABLE)`和`@...

    JPA 实现继承关系

    在Java世界中,Java Persistence API (JPA) 是一种用于管理关系数据库的框架,它提供了对象-关系映射(ORM)的功能,使得开发者可以使用面向对象的方式来操作数据库。本篇文章将深入探讨如何在JPA中实现继承关系,这...

    jpa例子jpajpa

    8. **多态性(Polymorphism)**: JPA支持继承和多态性,使得你可以定义一个基类,然后多个子类继承它并有自己的数据库表。 在"apache-openjpa-1.2.0-source"这个压缩包中,包含了Apache OpenJPA项目的源代码。Open...

    SpringDataJpa开发--继承JpaRepository实现简单条件查询

    `JpaRepository`是Spring Data JPA提供的一种高级抽象,它允许我们以声明式的方式处理CRUD操作,以及执行基本的查询。 首先,我们需要理解`JpaRepository`接口的作用。它是由Spring Data JPA提供的一个基础接口,...

    jpa/hibernate继承注解

    在Java Persistence API (JPA) 和 Hibernate ORM 框架中,继承注解是用于处理对象关系映射(ORM)中的类继承结构的关键概念。这些注解帮助开发者将数据库表的设计与面向对象的代码结构相匹配,使得在复杂的业务场景...

    JPA 标注 JPA标签手册

    Java Persistence API (JPA) 是Java企业版5(Java EE 5)的一部分,与Enterprise JavaBeans(EJB)3.0规范一起,极大地简化了Java持久化。它提供了一种对象关系映射方法,允许您以标准、可移植的方式声明性地定义...

    jpa经典文档呀

    7. **继承映射**:JPA允许实体类继承,提供了单表继承、联合继承和多表继承等多种策略。 8. **关联映射**:JPA支持一对一、一对多、多对一和多对多的关系映射,通过@OneToOne、@OneToMany、@ManyToOne和@ManyToMany...

    Spring Data JPA 简化 JPA 开发

    JPA 是 Java 平台上的标准 ORM(对象关系映射)规范,允许开发者使用面向对象的方式处理数据库操作,而无需直接编写 SQL 语句。JPA 通过注解或 XML 配置来定义对象与数据库表之间的映射关系,实现了数据持久化。 ...

    JPA视频教程_使用jpa映射关联和继承

    在这个**“JPA视频教程_使用jpa映射关联和继承”**中,我们将深入探讨如何利用JPA来处理实体之间的关联和类的继承关系。 **1. JPA 注解** JPA 注解是实现ORM的主要手段,它们可以直接在实体类上声明,用于定义...

    jpa

    **JPA(Java Persistence API)**是Java平台上用于管理关系数据库的数据持久化标准API,它为应用程序提供了一种对象/关系映射工具,将关系数据库中的数据与Java类对象关联起来,使得开发者可以使用面向对象的方式来...

    spring boot与cassandra集成,使用JPA方式。

    集成Spring Boot和Cassandra,使用JPA方式,不仅简化了数据访问层的代码,同时也保持了与关系型数据库类似的编程模型,使得开发更为便捷。然而,需要注意的是,Cassandra作为NoSQL数据库,其数据模型与传统的关系型...

    JPA (一)

    JPA 提供了一种面向对象的方式来操作数据库,使得开发人员可以使用 Java 对象来直接操作数据,而无需编写大量的 SQL 语句。这极大地提高了开发效率,并降低了对象关系映射(ORM)的复杂性。 ### JPA 的核心概念 1....

    spring mvc 的jpa JpaRepository数据层 访问方式汇总

    JpaRepository是Spring Data JPA项目提供的一个接口,它为数据访问提供了便捷的方式。在本篇文章中,我们将深入探讨如何在Spring MVC应用中使用JpaRepository来操作数据库。 首先,我们需要理解Spring MVC的架构。...

    Spring Data JPA 笔记

    通过继承`JpaRepository`或自定义Repository接口,可以轻松实现数据访问。例如,`findById`、`save`等方法都由Spring Data JPA自动提供。 3. **Querydsl**:Spring Data JPA可以与Querydsl结合使用,提供更强大的...

    JPA讲解视频

    JPA是Java EE和Java SE环境中持久化数据的标准方式,旨在简化数据库操作,并允许开发人员将业务逻辑与数据访问层分离。 在描述中提到的"基于Hibernate的JPA",意味着这个视频教程可能会深入到如何使用Hibernate作为...

    JPA大全之经典全集

    JPA通过提供API和元数据来描述如何将Java对象映射到数据库表,使得开发者可以使用面向对象的方式处理数据,而无需直接编写SQL语句。 ### JPA官方文档 JPA的官方文档详细介绍了JPA的规范和实现,包括其核心概念、...

    jpa的学习---jpa demo工程

    - **配置Repository**:定义接口继承`JpaRepository`或自定义方法,JPA会自动实现这些方法。 - **编写业务逻辑**:在服务层实现业务操作,调用Repository中的方法。 - **测试**:编写JUnit测试用例,验证JPA功能...

    jpa注解详解

    JPA(Java Persistence API)是Java企业版5(Java EE 5)的一部分,提供了一个对象关系映射方法,使得开发者可以使用声明方式定义如何将Java对象映射到关系数据库表。在JPA中,批注是一种使用元数据修饰Java源代码的...

Global site tag (gtag.js) - Google Analytics