我是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