Передача ответа объекта getCurrentAuditor на переходное поле JPA - PullRequest
0 голосов
/ 20 февраля 2019

Я новичок в 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

...