java - 使用 hibernate 保留基类和子类

标签 java hibernate jpa h2

我目前正在尝试自己构建一个带有 jdbc 连接的完整 Spring Boot Rest 服务。

目前,我正在努力解决有关 hibernate 和存储实体的理解小问题。

我有一个基类:

@Entity
@Table
public abstract class Person {

  private int id;
  private String firstName;
  private String middleName;
  private String lastName;

  @Id
  @GeneratedValue(generator = "increment")
  @GenericGenerator(name = "increment", strategy = "increment")
  public int getId() {
    return id;
  }

  public void setId(int id) {
    this.id = id;
  }

  @Column
  public String getFirstName() {
    return firstName;
  }

  public void setFirstName(String firstName) {
    this.firstName = firstName;
  }

  @Column
  public String getMiddleName() {
    return middleName;
  }

  public void setMiddleName(String middleName) {
    this.middleName = middleName;
  }

  @Column
  public String getLastName() {
    return lastName;
  }

  public void setLastName(String lastName) {
    this.lastName = lastName;
  }
}

还有 2 个子类:

@Entity
@Table
public class Member extends Person{

  private String memberNumber;

  @Column
  public String getMemberNumber() {
    return memberNumber;
  }

  public void setMemberNumber(String memberNumber) {
    this.memberNumber = memberNumber;
  }
}

@Entity
@Table
public class Supporter extends Person {

  private String supporterNumber;

  @Column
  public String getSupporterNumber() {
    return supporterNumber;
  }

  public void setSupporterNumber(String supporterNumber) {
    this.supporterNumber = supporterNumber;
  }
}

基类是抽象的,因为我想防止在不指定成员或支持者的情况下创建该实例。但在数据库方案中,由于标准化,我仍然希望有 3 个表。

我现在应该使用哪些注释来达到这个目标?我现在如何将一行成员或支持者链接到该成员?我真的很困惑。

谢谢!

最佳答案

从类到表的映射是由hibernate完成的。由于关系数据库表和 Java 对象有点不同,ORM 映射器有不同的策略来在它们之间进行映射。

Hibernate 可以使用以下策略:

  • 映射父类(super class)
  • 单表(默认)
  • 连接表
  • 每个类(class)的 table

您可以从 official documentation 阅读有关它们的更多信息。 .

它们有不同的优点和缺点,通常使用默认值是最安全的。但是默认策略仅使用一个表,因此您需要切换到其他策略。

每个类的表将创建三个表。您还可以查看 MappedSuperclass 和 Joined Table 的示例,它们也将使用多个表。

来自官方文档:

@Entity(name = "Account")
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public static class Account {
    @Id
    private Long id;
    private String owner;
    private BigDecimal balance;
    private BigDecimal interestRate;
    //Getters and setters are omitted for brevity
}

@Entity(name = "DebitAccount")
public static class DebitAccount extends Account {
    private BigDecimal overdraftFee;
    //Getters and setters are omitted for brevity
}

@Entity(name = "CreditAccount")
public static class CreditAccount extends Account {
    private BigDecimal creditLimit;
    //Getters and setters are omitted for brevity
}

将创建这些表:

CREATE TABLE Account (
    id BIGINT NOT NULL ,
    balance NUMERIC(19, 2) ,
    interestRate NUMERIC(19, 2) ,
    owner VARCHAR(255) ,
    PRIMARY KEY ( id )
)

CREATE TABLE CreditAccount (
    id BIGINT NOT NULL ,
    balance NUMERIC(19, 2) ,
    interestRate NUMERIC(19, 2) ,
    owner VARCHAR(255) ,
    creditLimit NUMERIC(19, 2) ,
    PRIMARY KEY ( id )
)

CREATE TABLE DebitAccount (
    id BIGINT NOT NULL ,
    balance NUMERIC(19, 2) ,
    interestRate NUMERIC(19, 2) ,
    owner VARCHAR(255) ,
    overdraftFee NUMERIC(19, 2) ,
    PRIMARY KEY ( id )
)

关于java - 使用 hibernate 保留基类和子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52020745/

相关文章:

java - 在 Java 中拆分具有特定模式的字符串

java - 如何使用Spring-Batch批量插入?

java - hibernate 是否可以创建数据库和数据库用户?

java - 是否有实现与默认映射不同的 Java 类型与 SQL 类型映射的最佳实践

java - 有人可以在 hibernate 中向我解释@MapsId吗?

java - 不能输入更新/删除查询 JPA

java - 使用 Servlet 和 HTML

java - 如何高效地 dockerized java 微服务

java - 应该返回值的方法可以像不返回任何内容(void)的方法一样使用吗?

hibernate - 如何在hql中使用来自select的更新?