这部分的内容基本与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借鉴了太多东西.
相关推荐
- **实体(Entity)**: 在JPA中,实体是对数据库表的映射,通常是一个Java类,它的实例对应于数据库中的行。 - **实体管理器(EntityManager)**: 是JPA的核心组件,负责创建、查询和管理实体。 - **实体工厂...
每个子类都有自己的数据库表,而父类的共享属性则存储在一个公共的表中。子类的表通过外键关联到父类的表。父类使用`@Inheritance(strategy = InheritanceType.JOINED)`注解,而子类则没有特定的注解。 3. **表...
5. **多态性**:支持子类继承父类实体,并在数据库中统一存储。 6. **查询语言**:JPQL和 Criteria 查询提供灵活的数据检索方式。 结合标签“工具”,我们可以想到JPA在实际开发中的应用场景,如Spring框架中的...
**Java Persistence API (JPA)** 是Java平台上的一个标准,用于管理关系数据库中的数据,它为开发者提供了一种对象/关系映射(ORM)工具,将数据库操作与业务逻辑解耦,简化了Java应用程序的数据存储过程。JPA是Java...
5. 组合:`@Embeddable`批注用于创建可嵌入的复杂类型,`@Embedded`用于将嵌入式对象包含在实体中,`@AttributeOverride`和`@AssociationOverride`用于覆盖子类中父类属性或关联的映射。 6. 继承:`@Inheritance`...
在Java世界中,Java Persistence API(JPA)是用于对象关系映射(ORM)的一种标准框架,它允许开发者将数据库操作与业务逻辑紧密结合,而无需编写大量的SQL代码。本篇文章将深入探讨如何在JPA中映射关联和实现继承。...
子类属性被存储在其各自的表中,而共享的属性则在父类表中。子类与父类之间通过外键关联。 3. **表分区继承(Table per Concrete Class Inheritance, TPC)** TPC策略也被称为“单独表”或“每类一张表”。每个类...
JPA的广泛使用得益于其与Hibernate等持久化框架的兼容性,因此在使用JPA时,Hibernate往往被用来提供底层的数据持久化实现。 在实际应用中,开发者可以通过阅读JPA规范文档以及使用注解和XML配置文件来实现各种复杂...
- **继承映射**:允许子类继承父类的属性和关系,并可以选择不同的继承策略。 - **批量操作**:如批量加载、批量保存、批量删除等操作,提高性能。 - **事务控制**:支持本地事务和全局事务,能够集成到容器级事务中...
Java 持续性API(JPA)是Java EE 5和Java SE 5中引入的一个标准,它简化了对象关系映射(ORM)的过程,允许开发者以声明式的方式定义Java对象如何与关系数据库中的表进行映射。JPA通过使用批注(Annotations)来配置...
- **主键层次结构**:在继承场景下,主键的定义可能会更加复杂,例如子类可以使用与父类相同的主键或定义自己的主键。 #### 四、生命周期回调 - **回调方法**:实体可以定义生命周期回调方法,这些方法将在实体...
下面将详细介绍JPA中一对一双向关联的概念、配置、实现方法以及其在实际开发中的应用。 一、一对一双向关联概念 一对一双向关联是指在一个实体类中有一个字段指向另一个实体类,同时在另一个实体类中也有一个字段...
综上,JPA 和注释在 Java 开发中起到了至关重要的作用,它们简化了数据库操作,提供了元数据的声明方式,并通过自定义注释扩展了元数据的功能。理解和熟练运用这些注解,能够提高代码的可读性,降低维护成本,同时...
5. **实现类继承**,在父类上使用`@MappedSuperclass`注解,并将所有属性的可见性设为`protected`,可以使子类继承父类的所有属性。 通过上述介绍,我们可以看出JPA框架中的注解机制极大地简化了实体类与数据库表...
在Java世界中,Spring JPA(Java Persistence API)是Spring框架的一个重要组成部分,它提供了一种简化数据库操作的抽象层。Spring JPA继承是处理数据库表继承关系的一种方式,允许我们在对象模型中定义继承结构,并...
例如,如果一个基类定义了一个属性 `salary`,而子类需要将其列名改为 `wage`,则可以在子类中使用 `@AttributeOverride` 来实现这一目的。 ```java // 基础类 Employee 定义 @MappedSuperclass public class ...
- 每个实体类映射到自己的表中,子类与父类表之间通过外键关联。 **2.8.4.3 Table_PER_Class策略** - 每个实体类都有自己的表,包括基类和派生类。 综上所述,Spring JPA提供了强大的数据持久化功能,通过其灵活的...
1. 在使用`@OneToMany`时,如果没有指定`mappedBy`,那么在父类中需要使用`@JoinColumn`指定外键字段,并且这个字段通常会在数据库中创建一个索引。 2. 当使用`FetchType.LAZY`时,需要确保JPA实现支持懒加载,例如...
-- Cat 的特定属性 --> </subclass></class>1.3.2 联合继承(Joined Table Inheritance)每个子类都有自己的数据库表,公共属性存储在父类表中,子类特有的属性存储在子类表中。子类表通过外键关联到父类表。1.3.3 ...