将getCurrentAuditor对象响应传递到瞬态JPA字段

时间:2019-02-20 02:00:28

标签: hibernate jpa spring-data-jpa audit transient

我是Spring Data审计员的新手,在尝试覆盖getCurrentAuditor()时遇到了一个特殊的情况。

audit方法返回一个AuditData类型的对象(在大多数情况下不同于String),并且需要由AuditPO类中以@CreatedBy注释的瞬态字段来使用。

@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

,然后使用JPA的@PrePersist选项对获得的值进行操作,以便我可以根据需要映射到各个字段。但是,我在那里不是很成功。我探索的另一种选择是围绕创建一个不同的EntityListener类,并在AuditPO中使用它,但这两种方法也不是很奏效(在后一种方法中可能会遗漏某些东西)。

此外,许多处理从getCurrentAuditor()返回对象的对象类型的示例都具有AuditPO类,该类具有@ CreatedBy / @ UpdatedBy的实例变量,然后该实例变量将JOIN与另一个表结合使用。我们的模型不支持这种方法。每个实体表都需要这两列。

我非常感谢您为实现上述目标提供的帮助。

P.S .:数据存储-MySQL 5.7.23,ORM-Hibernate,Spring-4.2.x

0 个答案:

没有答案