Spring JPA абстрактное поведение класса - PullRequest
0 голосов
/ 26 февраля 2019

У меня вопрос, что я делаю не так, мои сущности отображаются не так, как хотелось бы, когда я перехожу на h2-console Я вижу 3 таблицы, persons employee manager, когда я перехожу наВ таблице persons я вижу всех, кто расширяет этот класс abstract (employee, manager), но когда я перехожу к другим таблицам, я вижу только id этих классов.У меня вопрос, как это исправить, а также как заставить каждую таблицу отображать идентификатор, начиная с 1, потому что теперь таблица сотрудника имеет 3 идентификатора 1,2,3, а таблица менеджера имеет 4,5, таблица персоны отображается правильно,Я хотел бы отобразить 3 сотрудников в таблице сотрудников, 2 менеджера в таблице менеджеров и каждую сущность в таблице персон, а идентификаторы, начинающиеся с 1 в каждой таблице.

Абстрактный класс Person

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "descriminatorColumn")
@Table(name = "persons")
public abstract class Person {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;

@Column(name = "first_name")
private String firstName;

@Column(name = "last_name")
private String lastName;

@Column(name = "email")
private String address;

@Column(name = "age")
private int age;

public Person(String firstName, String lastName, String address, int age) {
    this.firstName = firstName;
    this.lastName = lastName;
    this.address = address;
    this.age = age;
}

public String getFirstName() {
    return firstName;
}

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

public String getLastName() {
    return lastName;
}

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

public String getAddress() {
    return address;
}

public void setAddress(String address) {
    this.address = address;
}

public int getAge() {
    return age;
}

public void setAge(int age) {
    this.age = age;
}

@Override
public String toString() {
    return "Person{" +
            "firstName='" + firstName + '\'' +
            ", lastName='" + lastName + '\'' +
            ", address='" + address + '\'' +
            ", age=" + age +
            '}';
  }
}

класс менеджера расширяет абстрактный класс Person

@Entity
@Table(name = "managers")
public class Manager extends Person {

public Manager(String firstName, String lastName, String email, int age) {
    super(firstName, lastName, email, age);
}

@Override
public String toString() {
    return super.toString();
 }
}

класс сотрудника расширяет абстрактный класс Person

@Entity
@Table(name = "employees")
public class Employee extends Person {

public Employee(String firstName, String lastName, String address, int age) {
    super(firstName, lastName, address, age);
}

@Override
public String toString() {
    return super.toString();
  }
}

1 Ответ

0 голосов
/ 26 февраля 2019

У меня вопрос, как это исправить

Нет абсолютно ничего, чтобы исправить, так как при использовании JOINED типа наследования он делает именно то, что вы указали, а именно:

  • сохранить данные, общие для сотрудника и менеджера в таблице персон.
  • сохранить данные, относящиеся к сотрудникам, в таблице сотрудников.
  • сохранить данные, относящиеся к менеджерам, в таблице менеджеров.

https://en.wikibooks.org/wiki/Java_Persistence/Inheritance#Joined,_Multiple_Table_Inheritance

В настоящее время Employee и Manager не определяют никаких дополнительных полей, поэтому в них существуют только идентификаторыэти таблицы.

Если это не изменится, вам, вероятно, будет лучше использовать SINGLE_TABLE наследование со столбцом дискриминатора, чтобы все данные были в 1 таблице.

https://en.wikibooks.org/wiki/Java_Persistence/Inheritance#Example_single_table_inheritance_table_in_database

Последний вариант - вообще не иметь никакого наследования на уровне базы данных, то есть иметь двух сотрудников таблицы и менеджеров, которые определяют все поля для каждого типа.Вы можете сделать это, используя @MappedSuperclass, что исключает необходимость дублирования отображений JPA в иерархии классов Java.

https://en.wikibooks.org/wiki/Java_Persistence/Inheritance#Mapped_Superclasses

, но помните об этом подходеВы не можете делать запросы для всех людей, но только для менеджеров и сотрудников отдельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...