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
相关产品推荐
相关产品推荐

