Spring Data多对多关系关联表新增@CreatedBy等审计属性的最佳实践
Spring Data 多对多关联表加审计字段最佳实现方案
核心思路
原生@ManyToMany注解仅能实现基础的多对多关联映射,无法直接给关联表附加自定义审计字段,因此需要将原多对多关联拆解为两个一对多关联,显式定义关联实体,在关联实体上配置审计属性即可,这是目前生产环境下兼容性和可维护性最高的实现方案。
前置准备
首先要在项目中开启JPA审计功能:
- 在启动类/配置类上添加
@EnableJpaAuditing注解 - 实现
AuditorAware<T>接口,用于返回当前操作的用户信息,供@CreatedBy、@LastModifiedBy字段自动填充
具体实现步骤
我们以Book和Author的多对多关联场景为例,关联表命名为book_author,需要添加4个审计字段:
1. 定义关联实体复合主键
使用@Embeddable定义复合主键类,必须实现Serializable接口,重写equals和hashCode方法:
@Embeddable public class BookAuthorId implements Serializable { private Long bookId; private Long authorId; public BookAuthorId() {} public BookAuthorId(Long bookId, Long authorId) { this.bookId = bookId; this.authorId = authorId; } // 自行实现equals、hashCode方法 }
2. 定义带审计字段的关联实体
关联实体上添加@EntityListeners(AuditingEntityListener.class)开启审计监听,配置四个审计字段:
@Entity @Table(name = "book_author") @EntityListeners(AuditingEntityListener.class) public class BookAuthor { @EmbeddedId private BookAuthorId id; @ManyToOne @MapsId("bookId") private Book book; @ManyToOne @MapsId("authorId") private Author author; @CreatedBy private String createdBy; @CreatedDate private LocalDateTime createdDate; @LastModifiedBy private String lastModifiedBy; @LastModifiedDate private LocalDateTime lastModifiedDate; // 省略构造方法、getter、setter }
3. 调整原业务实体的关联关系
将原@ManyToMany关联改为@OneToMany关联到自定义的关联实体:
// Book实体类 public class Book { // 其他业务字段省略 @OneToMany(mappedBy = "book", cascade = CascadeType.ALL, orphanRemoval = true) private List<BookAuthor> authors = new ArrayList<>(); } // Author实体类 public class Author { // 其他业务字段省略 @OneToMany(mappedBy = "author", cascade = CascadeType.ALL, orphanRemoval = true) private List<BookAuthor> books = new ArrayList<>(); }
注意事项
- 后续操作关联关系时,直接操作
BookAuthor对应的Repository即可,所有审计字段会自动填充,无需手动赋值 - 配置
orphanRemoval = true可以在解除关联时自动删除关联表对应数据,避免产生冗余记录
内容的提问来源于stack exchange,提问作者Andrea T
相关产品推荐
相关产品推荐

