首页 >Java >java教程 >理解 JPA 中的 @MappedSuperclass

理解 JPA 中的 @MappedSuperclass

PHPz
PHPz原创
2024-08-25 18:00:361112浏览

Entendendo @MappedSuperclass em JPA

JPA(Java Persistence API)提供了多个注释来将 Java 类映射到数据库表。一个这样有用的注释是@MappedSuperclass,它用于指定一个类,其属性必须由其他实体类继承,但它本身不是实体。让我们通过涉及 Vehicle、Car 和 Motorcycle 等类的实际示例来探索此注释的有用性。

@MappedSuperclass 是什么?

@MappedSuperclass 注解用于指示一个类不应该是一个独立的实体,但它的属性应该被其他作为实体的类继承。当您想要在多个实体之间共享公共属性而不为基类创建单独的表时,这非常有用。

主要特点:

  1. - 用 @MappedSuperclass 注解的类不是一个实体。
  2. - 无法直接在 @MappedSuperclass 类上执行查询。
  3. - 扩展 @MappedSuperclass 类的子类映射到数据库中的各个表,但继承基类的字段。

实际示例

让我们创建一个包含 Vehicle、Car 和 Motorcycle 类层次结构的示例,其中 Vehicle 是超类。

1。基类:车辆

import javax.persistence.MappedSuperclass;

@MappedSuperclass
public abstract class Veiculo {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String marca;
    private String modelo;
    private int ano;

    // Getters e Setters

}
  • Vehicle 类用 @MappedSuperclass 进行注释。
  • Vehicle 类的 id 字段用 @id 和 @GenerateValue 注释。这个唯一标识符将被所有子类继承,确保从Vehicle派生的每个实体都有一个id字段。
  • 它定义了三个常见属性:品牌、型号和年份。

2。子类:汽车

import javax.persistence.Entity;
import javax.persistence.Table;

@Entity
@Table(name = "carro")
public class Carro extends Veiculo {

    private int quantidadePortas;

    // Getters e Setters

}
  • Car 类继承了 Vehicle 类的属性。
  • 它用@Entity注释并映射到名为car的表。

3。子类:摩托车

import javax.persistence.Entity;
import javax.persistence.Table;

@Entity
@Table(name = "motocicleta")
public class Motocicleta extends Veiculo {

    private boolean temSidecar;

    // Getters e Setters
}
  • Motorcycle 类也继承了 Vehicle 类的属性。
  • 它用@Entity注释并映射到一个名为motorcycle的表。

表格映射

使用上述类,JPA 将在数据库中创建以下表:

  1. 汽车表:包含品牌、型号、年份和数量门的列。
  2. 摩托车:包含品牌、型号、年份和 temSidecar 列。

Vehicle 表在数据库中不存在,因为 Vehicle 类只是一个超类,而不是实体。

使用 @MappedSuperclass

的好处
  • 标识符集中化:id字段在超类中管理。源自车辆的所有实体共享相同的标识方案。
  • 代码重用:公共属性可以集中在超类中,避免子类中的重复。
  • 易于维护:可以在一处对公共属性进行更改。
  • 内聚数据模型:子类共享相同的结构,这使得模型更易于操作和理解。

注意事项

如果您希望超类也是一个实体(例如用于直接查询),请使用@Inheritance继承策略而不是@MappedSuperclass。
@MappedSuperclass 非常适合基类不需要作为单个实体持久化,但其属性与多个实体相关的情况。

结论

@MappedSuperclass 注释是在 JPA 中创建可重用类层次结构的强大工具。在上面的示例中,我们能够集中车辆中的公共属性,同时保持汽车和摩托车实体的灵活性和独立性。这种方法促进了更清晰、更模块化的设计,特别是在具有共享相似特征的多个实体的系统中。

以上是理解 JPA 中的 @MappedSuperclass的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn