Условная аннотация @AttributeOverride Hibernate - PullRequest
0 голосов
/ 26 марта 2019

У меня есть две таблицы FoodAudit и IngredientAudit, которые отражают (плюс некоторые дополнительные столбцы) таблицы Food и Ingredient как часть системы редакций, над которой я работаю. В идеале обе эти таблицы должны отображаться на RevisionDetail<T> объектов в моей модели предметной области, но это немного сложно. Для этого я хочу встроить объект Food или Ingredient, как показано ниже.

@Entity
public class RevisionDetail<T> {        
    @Column(name="RevisionId")
    private int revisionId;

    @Column(name="Operation")
    private Operation operation;

    @Embedded
    private T entity;

    public RevisionDetail() {}
}

Вместо Id в таблицах аудита столбец имеет значение FoodId или IngredientId в таблицах аудита. Я бы подумал использовать аннотацию @AttributeOverride, но имя столбца меняется в зависимости от того, является ли он объектом Food или Ingredient. Как я могу сделать это?

1 Ответ

0 голосов
/ 26 марта 2019

Рассмотрите возможность использования Envers .

Если вы хотите реализовать это самостоятельно, я предлагаю использовать наследование с аннотацией @MappedSuperClass для базового типа, которое будет расширено всеми подклассами, которые можно проверить.

@MappedSuperClass
publci class BaseEntity{
    @Id 
    Long id;
}

Чем можно сопоставить сущность с ревизией:

@OneToOne
@JoinColumn(name="fk_id")
BaseEntity entity;

@ AttributeOverride может переопределять только атрибуты аннотации @Column. Название столбца.

@ Embeded может использоваться для класса @Embedable, который не является сущностью и не имеет собственной таблицы. Поля встраиваемой воли по части владеющей сущности / таблицы

...