`
endual
  • 浏览: 3567246 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

JPA 父类与子类在数据库中实现

    博客分类:
  • JPA
 
阅读更多

 

分享
 
分类: Java2006-09-06 23:06

这部分的内容基本与Hibernate一致.JPA同样支持3种类型的继承形式:

1.Single Table Strategy ,单表策略,一张表包含基类与子类的所有数据,很多情况下都是采用这样的冗余设计,通过一个discriminator来区分

2.Table Per Class Strategy ,每个子类对应一张表,每张表都拥有基类的属性

3.Join Strategy ,仍然是每个子类对应一张表,但此表中不包含基类的属性,仅仅是此子类的扩展属性,共享基类的属性

 

以一个例子来说明3种情况:

一.单表策略

比如Pet作为基类,Cat和Dog继承此类并拥有自己的扩展属性,如:

package com.denny_blue.ejb3.inheritance;

import java.io.Serializable;

import javax.persistence.DiscriminatorColumn;
import javax.persistence.DiscriminatorType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "animal_type", discriminatorType = DiscriminatorType.STRING)
public class Pet implements Serializable {
 private int id;

 private String name;

 private double weight;

 public Pet() {
 }

 @Id
 @GeneratedValue(strategy = GenerationType.AUTO)
 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 double getWeight() {
  return weight;
 }

 public void setWeight(double weight) {
  this.weight = weight;
 }

}

Pet类值的注意的就是通过@Inheritance(strategy = InheritanceType.SINGLE_TABLE)确定采用单表策略,通过@DiscriminatorColumn确定了标志值的字段和类型,我想熟悉hibernate的朋友对这些都应该很熟悉.然后是两个子类:

//Cat.java

package com.denny_blue.ejb3.inheritance;

import javax.persistence.DiscriminatorColumn;
import javax.persistence.DiscriminatorType;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(discriminatorType = DiscriminatorType.STRING)
@DiscriminatorValue("cat")
public class Cat extends Pet {
 private String HairBall;

 public String getHairBall() {
  return HairBall;
 }

 public void setHairBall(String hairBall) {
  HairBall = hairBall;
 }

}

//Dog.java

package com.denny_blue.ejb3.inheritance;

import javax.persistence.DiscriminatorColumn;
import javax.persistence.DiscriminatorType;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;

@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(discriminatorType=DiscriminatorType.STRING)
@DiscriminatorValue("dog")
public class Dog extends Pet {
 private String trick;

 public String getTrick() {
  return trick;
 }

 public void setTrick(String trick) {
  this.trick = trick;
 }

}

两个子类最值的关注的就是@DiscriminatorValue注释,比如Cat的此值为cat,意味着当Cat类型的Entity存入数据库时,JPA将自动把cat的值赋给animal_type字段,Dog的值则为dog,由此就可以在同一张表中区分开两个不同的子类.

 

二.Table per Class

采用Table Per Class策略的话,每个子类都将单独建表,并且都独立拥有基类中的所有属性,互相之间不共享,在我们的例子中所要进行的修改很小,像这样:

//基类

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class Pet implements Serializable {
 private int id;

 private String name;

 private double weight;

........

//子类:不需要任何设置

@Entity
public class Dog extends Pet {
 private String trick;

  .......

  .......

 

三.Join策略

每个子类同样独立建表,基类也独立建表,只不过所有的子类的表中只有扩展属性,他们共享基类的表,在我们的例子中修改下即可:

//基类

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Pet implements Serializable {
 private int id;

 private String name;

 private double weight;

  ........

//子类

@Entity

@Inheritance(strategy = InheritanceType.JOINED)
public class Dog extends Pet {
 private String trick;

  .......

  .......

这部分的内容实在没什么新意,与hibernate完全一致.JAVA EE5向spring和hibernate借鉴了太多东西.

分享到:
评论

相关推荐

    jpa实现数据库操作

    - **实体(Entity)**: 在JPA中,实体是对数据库表的映射,通常是一个Java类,它的实例对应于数据库中的行。 - **实体管理器(EntityManager)**: 是JPA的核心组件,负责创建、查询和管理实体。 - **实体工厂...

    JPA 实现继承关系

    每个子类都有自己的数据库表,而父类的共享属性则存储在一个公共的表中。子类的表通过外键关联到父类的表。父类使用`@Inheritance(strategy = InheritanceType.JOINED)`注解,而子类则没有特定的注解。 3. **表...

    jpa

    5. **多态性**:支持子类继承父类实体,并在数据库中统一存储。 6. **查询语言**:JPQL和 Criteria 查询提供灵活的数据检索方式。 结合标签“工具”,我们可以想到JPA在实际开发中的应用场景,如Spring框架中的...

    JPA.rar_jpa

    **Java Persistence API (JPA)** 是Java平台上的一个标准,用于管理关系数据库中的数据,它为开发者提供了一种对象/关系映射(ORM)工具,将数据库操作与业务逻辑解耦,简化了Java应用程序的数据存储过程。JPA是Java...

    JPA全面讲解

    5. 组合:`@Embeddable`批注用于创建可嵌入的复杂类型,`@Embedded`用于将嵌入式对象包含在实体中,`@AttributeOverride`和`@AssociationOverride`用于覆盖子类中父类属性或关联的映射。 6. 继承:`@Inheritance`...

    使用jpa映射关联和继承

    在Java世界中,Java Persistence API(JPA)是用于对象关系映射(ORM)的一种标准框架,它允许开发者将数据库操作与业务逻辑紧密结合,而无需编写大量的SQL代码。本篇文章将深入探讨如何在JPA中映射关联和实现继承。...

    jpa/hibernate继承注解

    子类属性被存储在其各自的表中,而共享的属性则在父类表中。子类与父类之间通过外键关联。 3. **表分区继承(Table per Concrete Class Inheritance, TPC)** TPC策略也被称为“单独表”或“每类一张表”。每个类...

    JPA2映射的神秘之旅

    JPA的广泛使用得益于其与Hibernate等持久化框架的兼容性,因此在使用JPA时,Hibernate往往被用来提供底层的数据持久化实现。 在实际应用中,开发者可以通过阅读JPA规范文档以及使用注解和XML配置文件来实现各种复杂...

    JPA 规范1.0 中文版

    - **继承映射**:允许子类继承父类的属性和关系,并可以选择不同的继承策略。 - **批量操作**:如批量加载、批量保存、批量删除等操作,提高性能。 - **事务控制**:支持本地事务和全局事务,能够集成到容器级事务中...

    java JPA 批注参考

    Java 持续性API(JPA)是Java EE 5和Java SE 5中引入的一个标准,它简化了对象关系映射(ORM)的过程,允许开发者以声明式的方式定义Java对象如何与关系数据库中的表进行映射。JPA通过使用批注(Annotations)来配置...

    Openjpa手册

    - **主键层次结构**:在继承场景下,主键的定义可能会更加复杂,例如子类可以使用与父类相同的主键或定义自己的主键。 #### 四、生命周期回调 - **回调方法**:实体可以定义生命周期回调方法,这些方法将在实体...

    JPA中的一对一双向关联

    下面将详细介绍JPA中一对一双向关联的概念、配置、实现方法以及其在实际开发中的应用。 一、一对一双向关联概念 一对一双向关联是指在一个实体类中有一个字段指向另一个实体类,同时在另一个实体类中也有一个字段...

    JPA 和 注释文档

    综上,JPA 和注释在 Java 开发中起到了至关重要的作用,它们简化了数据库操作,提供了元数据的声明方式,并通过自定义注释扩展了元数据的功能。理解和熟练运用这些注解,能够提高代码的可读性,降低维护成本,同时...

    JPA框架新技术: 注解

    5. **实现类继承**,在父类上使用`@MappedSuperclass`注解,并将所有属性的可见性设为`protected`,可以使子类继承父类的所有属性。 通过上述介绍,我们可以看出JPA框架中的注解机制极大地简化了实体类与数据库表...

    spring-jpa-inheritance

    在Java世界中,Spring JPA(Java Persistence API)是Spring框架的一个重要组成部分,它提供了一种简化数据库操作的抽象层。Spring JPA继承是处理数据库表继承关系的一种方式,允许我们在对象模型中定义继承结构,并...

    JPA批注.pdf

    例如,如果一个基类定义了一个属性 `salary`,而子类需要将其列名改为 `wage`,则可以在子类中使用 `@AttributeOverride` 来实现这一目的。 ```java // 基础类 Employee 定义 @MappedSuperclass public class ...

    Spring JPA学习

    - 每个实体类映射到自己的表中,子类与父类表之间通过外键关联。 **2.8.4.3 Table_PER_Class策略** - 每个实体类都有自己的表,包括基类和派生类。 综上所述,Spring JPA提供了强大的数据持久化功能,通过其灵活的...

    Hibernate 注解一对多,多对一

    1. 在使用`@OneToMany`时,如果没有指定`mappedBy`,那么在父类中需要使用`@JoinColumn`指定外键字段,并且这个字段通常会在数据库中创建一个索引。 2. 当使用`FetchType.LAZY`时,需要确保JPA实现支持懒加载,例如...

    Hibernate PPT

    -- Cat 的特定属性 --> </subclass></class>1.3.2 联合继承(Joined Table Inheritance)每个子类都有自己的数据库表,公共属性存储在父类表中,子类特有的属性存储在子类表中。子类表通过外键关联到父类表。1.3.3 ...

Global site tag (gtag.js) - Google Analytics