Spring Data JDBC聚合内嵌套一对多关系映射问题求助
Spring Data JDBC 聚合内嵌套一对多复合键映射问题解决
问题核心
你遇到的INSERT语句缺失BOOK_ID的问题,本质是:BookCopy的主键是复合键(BOOK_ID, COPY_NUMBER),但映射BookCopyQualityControl时仅指定了COPY_NUMBER作为关联列,且BookCopy类未保留BOOK_ID字段,导致Spring Data JDBC无法将聚合根Book的ID传递到第三层实体。
解决步骤
- 在
BookCopy类中新增bookId字段,用于存储关联的BookID(Spring Data JDBC会自动填充该值)。 - 将
BookCopy中@MappedCollection的idColumn替换为复数形式的idColumns参数,同时指定BOOK_ID和COPY_NUMBER两个外键列,对应BookCopy的bookId和copyNumber字段。
修改后的代码
BookCopy.java
public class BookCopy { private Long bookId; // 新增:对应BOOK_COPY表的BOOK_ID字段 private Long copyNumber; private final String authorMessage; // 用idColumns数组指定多个关联外键列 @MappedCollection(idColumns = { @Column("BOOK_ID"), @Column("COPY_NUMBER") }) private Set<BookCopyQualityControl> qualityControls; BookCopy(String authorMessage) { this.authorMessage = authorMessage; qualityControls = new HashSet<>(); } BookCopyQualityControl addQualityControl(Integer score) { BookCopyQualityControl newQualityControl = new BookCopyQualityControl(score); this.qualityControls.add(newQualityControl); return newQualityControl; } public Long getBookId() { return bookId; } public String getAuthorMessage() { return authorMessage; } public Long getCopyNumber() { return copyNumber; } public Set<BookCopyQualityControl> getQualityControls() { return qualityControls; } }
其他代码无需修改
Book、BookCopyQualityControl、BookRepository类以及数据库DDL保持你原有的代码即可。
验证效果
修改后执行测试代码,Spring Data JDBC会生成包含BOOK_ID、COPY_NUMBER的INSERT语句,正确填充BOOK_COPY_QUALITY_CONTROL表的所有必填字段,解决NULL约束报错问题。
内容的提问来源于stack exchange,提问作者Bidone
相关产品推荐
相关产品推荐

