Можно ли использовать @JoinTable в подклассе, который включает поля target + join?

Моя модель (на примере) следующая:

CREATE TABLE person (
  id INT PRIMARY KEY,
  name TEXT
  ...
);

CREATE TABLE team (
  id INT PRIMARY KEY,
  name TEXT
  ....
);

CREATE TABLE team_reference_persons (
  team_id INT NOT NULL,
  person_id INT NOT NULL,
  uses_telephone BOOLEAN, 
  PRIMARY KEY (team_id, person_id),
  FOREIGN KEY (team_id) REFERENCES team(id),
  FOREIGN KEY (person_id) REFERENCES person(id)
);

И мое определение JPA:

@Entity
@Table(name = "team")
public class Team {
    @Id
    private Integer id;

    @OneToMany
    @JoinTable(name = "team_reference_persons", joinColumns = @JoinColumn(name = "team_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "person_id", referencedColumnName = "id"))
    private List<Person> teamReferencePersons;
    ...
}

@Entity
@Table(name = "person")
public class Person {
    @Id
    private UUID id;
    private String name;
    ...
}

Пока все хорошо, когда все, что вам нужно, это список людей в команде. Но теперь мне нужно добавить свойство team_reference_persons.uses_telephone из таблицы соединений в моем личном домене, поэтому я ищу способ сохранить логику людей, пока я создаю новый подкласс.

private class TeamIndividual extends Person {
    boolean uses_telephone;
}

Затем замените List<Person> на объект Team на List<TeamIndividual>. Это вообще возможно? JPA следует указывать таким умным образом, чтобы он добавлял свойство таблицы соединений к конечной целевой сущности (как при чтении, так и при сохранении).

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
44
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
  • Нет необходимости расширять TeamIndividual на Person.
  • Добавьте аннотации к TeamIndividual с помощью @Table (name = "team_reference_persons")
  • Определите поля (teamId, personId, uses_telephone) внутри TeamIndividual
  • Аннотируйте поля teamId и PersonId с помощью @ManyToOne и @JoinColumn
  • Добавить список в команду без аннотации Попробуйте, это сработает .. !!

Спасибо!. Но у меня проблема. Если я конвертирую объединенную таблицу в сущность, мне понадобится первичный ключ для моей сущности Spring Data. Нет ли еще одного хитрого способа с соединительной таблицей прозрачным способом? Или мне следует составить первичный ключ?

Whimusical 08.05.2018 15:25

Используйте составной первичный ключ с использованием идентификатора команды и идентификатора человека

Pankaj Goyal 08.05.2018 15:32

Другие вопросы по теме