Вот пример с некоторыми пояснениями, которые могут помочь.
@ MappedSuperclass:
- это удобный класс
- Используется для хранения общего состояния и поведения, доступных для дочерних классов
- Не является устойчивым
- Только дочерние классы являются постоянными
@ Наследование задает одну из трех стратегий отображения:
- однотабличные
- Таблица на класс
@ DiscriminatorColumn используется для определения того, какой столбец будет использоваться для различения дочерних объектов.
@ DiscriminatorValue используется для указания значения, которое используется для различения дочернего объекта.
Следующий код приводит к следующему:
![enter image description here](https://i.stack.imgur.com/3rMfh.png)
Вы можете видеть, что поле id находится в обеих таблицах, но указывается только в AbstractEntityId @ MappedSuperclass.
Кроме того, @DisciminatorColumn отображается как PARTY_TYPE в таблице Party.
@DiscriminatorValue отображается как Персона как запись в столбце PARTY_TYPE таблицы Party.
Очень важно, что класс AbstractEntityId вообще не сохраняется.
Я не указал аннотации @Column и вместо этого просто полагаюсь на значения по умолчанию.
Если бы вы добавили сущность организации, которая расширила Сторону, и если бы она сохранялась следующей, то таблица Стороны имела бы:
- id = 2
- PARTY_TYPE = "Организация"
Первая запись таблицы организации будет иметь:
- id = 2
- другое значение атрибута, связанное конкретно с организациями
@MappedSuperclass
@SequenceGenerator(name = "sequenceGenerator",
initialValue = 1, allocationSize = 1)
public class AbstractEntityId implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(generator = "sequenceGenerator")
protected Long id;
public AbstractEntityId() {}
public Long getId() {
return id;
}
}
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "PARTY_TYPE",
discriminatorType = DiscriminatorType.STRING)
public class Party extends AbstractEntityId {
public Party() {}
}
@Entity
@DiscriminatorValue("Person")
public class Person extends Party {
private String givenName;
private String familyName;
private String preferredName;
@Temporal(TemporalType.DATE)
private Date dateOfBirth;
private String gender;
public Person() {}
// getter & setters etc.
}
Надеюсь, это поможет:)