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

Spring Boot中如何关联SQL表?如何绑定Author类与Book类的作者姓名字段?

JPA实体关联绑定实现方案

1. 关联关系说明

业务中1个作者可以对应多本图书,因此采用一对多/多对一关联:Author侧为一对多关系持有多个Book,Book侧为多对一关系关联单个Author。

2. 调整实体类代码

修改后的Book类

首先删除原有String类型的author字段,替换为Author类型的关联字段,添加JPA关联注解:

@Entity // 补充实体类注解,原有代码缺失
@Data
public class Book {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "book_id")
    private int id;
    @Column(name = "book_title")
    private String title;
    @Column(name = "book_genre")
    private String genre;
    // 新增多对一关联,关联Author表主键
    @ManyToOne(fetch = FetchType.LAZY) // 懒加载,按需改为EAGER立即加载
    @JoinColumn(name = "author_id", referencedColumnName = "author_id")
    private Author author;

    // 可选:直接获取作者全名的工具方法,接口返回时会自动序列化该字段
    public String getAuthorFullName() {
        return author != null ? author.getFirstName() + " " + author.getLastName() : null;
    }
}

可选修改后的Author类(需要从作者侧查询名下书籍时添加)

添加一对多反向关联字段:

@Entity
@Table(name="Author")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Author {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="author_id")
    private int authorId;
    
    @Column(name="author_firstName")
    private String firstName;
    
    @Column(name="author_lastName")
    private String lastName;
    @Column(name="author_birth")
    private Date birth;

    // 新增反向关联,mappedBy值和Book类中的关联字段名保持一致
    @OneToMany(mappedBy = "author", cascade = CascadeType.REMOVE) // 级联删除:删除作者时同步删除名下所有书籍,按需配置级联规则
    private List<Book> books;
}

3. Postman调试说明

  • 新增图书时,若关联的作者已存在,请求体仅需传入作者ID即可:
{
    "title": "三体",
    "genre": "科幻",
    "author": {
        "authorId": 1
    }
}
  • 查询图书时,返回结果会自动带出关联的作者信息,包含firstName、lastName字段,也会返回我们新增的authorFullName拼接字段。如果不需要返回作者的冗余信息(比如出生日期),可以自定义DTO封装返回字段,或者用@JsonIgnore注解屏蔽不需要序列化的字段。

内容的提问来源于stack exchange,提问作者Ivana

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 02:27:02