Я новичок в Spring Data Auditor и сталкиваюсь со своеобразным сценарием, пытаясь переопределить getCurrentAuditor()
.
Метод auditor возвращает объект типа AuditData
(в отличие от String в большинстве случаев) идолжен использоваться переходным полем, аннотированным @CreatedBy в классе AuditPO
.
@CompileStatic
@ToString
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonPropertyOrder(alphabetic = true)
@EqualsAndHashCode
class AuditData {
UUID userId
UUID profileId
}
AuditPO
класс содержит различные столбцы, относящиеся к постоянной информации аудита.Этот класс расширяется каждой сущностью, поэтому соответствующая таблица сущностей имеет одинаковый набор столбцов с соответствующей информацией аудита.
Ниже приведен пример с таблицами ролей и разрешений.RolePO
/ PermissionPO
расширяет UuidPO
, что в конечном итоге расширяет это AuditPO
:
@Entity
@Table(name = 'Role')
@ToString(includeNames = true, includeSuper = true)
class RolePO extends UuidPO {
@NotNull(message = '{role.name.required}')
@Size(max = 30, message = '{role.name.size}')
String name
@Size(max = 100, message = '{role.description.size}')
String description
}
@Entity
@Table(name = 'Permission')
@ToString(includeNames = true, includeSuper = true)
class PermissionPO extends UuidPO {
@NotNull(message = '{permission.name.required}')
@Size(max = 36, message = '{permission.name.size}')
String name
@Size(max = 100, message = '{permission.description.size}')
String description
}
@MappedSuperclass
@ToString(includeNames = true)
abstract class UuidPO extends AuditPO {
@Id
@GeneratedValue(generator = 'uuid2')
@GenericGenerator(name = 'uuid2', strategy = 'uuid2')
@Column(columnDefinition = 'VARCHAR(36)')
@Type(type = 'uuid-char')
UUID id
}
@MappedSuperclass
@EntityListeners(AuditingEntityListener)
@ToString(includeNames = true)
abstract class AuditPO {
@CreatedBy
AuditData create
@LastModifiedBy
AuditData update
@Type(type = 'uuid-char')
UUID createdByProfileId
@Type(type = 'uuid-char')
UUID updatedByProfileId
@Type(type = 'uuid-char')
UUID createdByUserId
@Type(type = 'uuid-char')
UUID updatedByUserId
@CreatedDate
@Column(columnDefinition = "DATETIME(3)")
Date createDate
@LastModifiedDate
@Column(columnDefinition = "DATETIME(3)")
Date updateDate
}
Конечная цель - сопоставить auditData.userId
с auditPO.(created/updated)ByUserId
и auditData.profileId
до auditPO.(created/updated)ByProfileId
.
Один из подходов, который я изучал, состоял в том, чтобы создать что-то вроде следующего:
@Transient
@CreatedBy
AuditData create
и затем использовать опцию @PrePersist
JPA, чтобы действоватьна полученные значения, чтобы я мог сопоставить с соответствующими полями, как мне нужно.Тем не менее, я не был очень успешным там.Другой вариант, который я исследовал, заключался в создании другого класса EntityListener и использовании его в AuditPO, но он также не был очень плодотворным (возможно, что-то упустили в последнем подходе).
Кроме того, множество примеров имеют дело сс обработкой типа объекта, возвращаемого из getCurrentAuditor()
, был установлен класс AuditPO с переменной экземпляра для @ CreatedBy / @ updatedBy, которая затем будет иметь JOIN с другой таблицей.Наша модель не подходит для такого подхода.Каждая таблица сущностей нуждается в этих двух столбцах.
Я был бы очень признателен за любую помощь в достижении цели, указанной выше.
PS: хранение данных - MySQL 5.7.23, ORM - Hibernate, Spring - 4.2.x