В JPA использовать @MappedSuperclass
для наследования , аннотировать абстрактные классы, а не интерфейсы.
Я склонен использовать общие базовые классы для всех моих сущностей в данном проекте:
@MappedSuperclass
public abstract class BaseEntity implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
}
Теперь давайте скажем, что некоторые из моих сущностей имеют дополнительное общее поведение: автоматически обновляемые метки времени для созданных и обновленных дат
@MappedSuperclass
public abstract class ExtendedEntity extends BaseEntity{
@Temporal(TemporalType.TIMESTAMP)
private Date createdDate;
@Temporal(TemporalType.TIMESTAMP)
private Date updatedDate;
@PrePersist
protected void creationTimeStamp(){
createdDate = new Date();
this.updateTimeStamp();
}
@PreUpdate
protected void updateTimeStamp(){
updatedDate = new Date();
}
}
Теперь некоторые из моих сущностей расширяют BaseEntity
напрямую, идругие расширяют ExtendedEntity
(если им нужны временные метки).
Вы также можете настроить способ моделирования наследования :
- Одна таблица для иерархии классов
- Таблица для каждого конкретного класса сущности (по умолчанию)
- Стратегия «соединения», при которой поля или свойства, относящиеся к подклассу, сопоставляются с таблицей, отличной от полей или свойств, которые являютсяобщий для родительского класса
Кстати: я думаю, что выбор не поддерживать интерфейсы - это хороший выбор.Интерфейсы предназначены для моделирования поведения, а не состояния.JPA - это управление состоянием, а не поведением, поэтому эти два понятия не сочетаются друг с другом.
И в тех случаях, когда вы считаете, что вам нужно множественное наследование, возможно @Embeddable
- это решение