При аудите внешнего ключа Envers, похоже, игнорирует аннотацию JoinColumn.
Например. У меня есть такой простой класс:
@Audited
@Entity
public class Address {
@Id
@GeneratedValue
private int id;
@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
@ManyToOne
@JoinColumn (name="addressTypeFk", referencedColumnName="EntityId",nullable=false)
private AddressTypeLookup addressType;
Что ссылается на такую таблицу поиска:
@Entity
public class AddressTypeLookup
{
@Id
@GeneratedValue
private int id;
private String descr;
private int entityId;
Обратите внимание, что атрибут addressType в Address присоединяется к столбцу entityId, а не столбцу «id» первичного ключа. Также обратите внимание на использование RelationTargetAuditMode.NOT_AUDITED: я хочу проверять внешний ключ, но не хочу проверять изменения AddressTypeLookup. Проблема в том, что когда Envers записывает изменения внешнего ключа, он записывает значение «id» первичного ключа AddressTypeLookup, а не entityId. Как заставить Envers записывать используемые значения entityId?
[В случае, если вам интересно, зачем мне это: у нас есть база данных поисковых данных (она же основные / справочные данные). Он записывает историю: все строки имеют даты начала и окончания. Столбец id действительно уникален; entityId идентифицирует конкретную вещь - например, все версии определенного типа адреса. Все таблицы поиска реплицируются в базу данных приложения, но реплицируются только текущие данные, а не исторические данные. ]