You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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传递到第三层实体。

解决步骤

  1. 在BookCopy类中新增bookId字段,用于存储关联的BookID(Spring Data JDBC会自动填充该值)。
  2. 将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 11:27:25