Persist базы и подкласс с Hibernate - PullRequest
0 голосов
/ 25 августа 2018

Я сейчас пытаюсь создать полный сервис Spring Boot Rest с подключением jdbc самостоятельно.

В настоящее время я борюсь с незначительной проблемой понимания гибернации и хранения сущностей.

У меня есть один базовый класс:

@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 таблицы из-за нормализации.

Какие аннотации я должен использовать сейчас, чтобы достичь этой цели?Как я могу связать ряд участника или сторонника с участником сейчас?Я действительно запутался.

Спасибо!

1 Ответ

0 голосов
/ 25 августа 2018

Отображение из класса в таблицу выполняется с помощью hibernate.Так как таблица реляционной базы данных и объект Java несколько разные, для сопоставления ORM существуют разные стратегии отображения между ними.

Hibernate может использовать следующие стратегии:

  • MappedSuperclass
  • Одиночная таблица (по умолчанию)
  • Объединенная таблица
  • Таблица для класса

Подробнее о них можно прочитать в официальной документации .

У них разные плюсы и минусы, и обычно безопаснее всего использовать значение по умолчанию.Однако в стратегии по умолчанию используется только одна таблица, поэтому вам нужно переключиться на другую стратегию.

Таблица для каждого класса создаст три таблицы.Вы также можете проверить примеры для 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 )
)
...