Spring Boot项目中如何自动获取MySQL多对多关联表的映射模型?
解决方案
你完全不需要手动查询三张表拼接对象,Spring Data JPA本身就支持基于外键的多对多关联映射,配置后可以直接拿到包含关联配料的披萨实体,步骤如下:
1. 调整实体类配置多对多关联
不需要维护中间表pizza_with_topping对应的实体类和Repository,直接在披萨、配料实体类上加注解配置关联即可:
Pizza实体类配置
@Entity @Table(name = "pizza") public class Pizza { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "pizza_name", nullable = false) private String pizzaName; // 配置与Topping的多对多关联 @ManyToMany(fetch = FetchType.LAZY) @JoinTable( name = "pizza_with_topping", // 指定你的中间表名称 joinColumns = @JoinColumn(name = "pizza_id"), // 中间表关联pizza表的字段 inverseJoinColumns = @JoinColumn(name = "topping_id") // 中间表关联topping表的字段 ) private List<Topping> toppings; // 此处省略getter、setter、构造方法 }
Topping实体类配置(可选反向关联)
如果不需要从配料反向查询所属的披萨,以下代码可以省略:
@Entity @Table(name = "topping") public class Topping { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "topping_name", nullable = false) private String toppingName; @Column(nullable = false) private Integer price; @Column(nullable = false) private Boolean spicy; // 反向关联,mappedBy值对应Pizza类中关联属性的名称 @ManyToMany(mappedBy = "toppings", fetch = FetchType.LAZY) private List<Pizza> pizzas; // 此处省略getter、setter、构造方法 }
2. 直接查询拿到组合对象
你的PizzaRepository不需要修改,还是继承CrudRepository或者JpaRepository即可:
public interface PizzaRepository extends JpaRepository<Pizza, Long> { }
调用findAll()方法返回的每个Pizza对象,已经自动包含了关联的toppings配料列表,无需手动拼接:
// 一次查询即可拿到所有披萨+对应配料的组合数据 List<Pizza> allPizzas = pizzaRepository.findAll(); // 直接取用即可 for (Pizza pizza : allPizzas) { System.out.println("披萨名称:" + pizza.getPizzaName()); System.out.println("配料列表:" + pizza.getToppings().stream() .map(Topping::getToppingName) .collect(Collectors.toList())); }
补充说明
- 加载策略按需调整:如果每次查询披萨都需要用到配料,可以把
@ManyToMany的fetch属性改为FetchType.EAGER,避免懒加载触发的N+1查询问题;如果不是每次都用到配料,保持默认LAZY即可,需要时再加载关联数据。 - 中间表操作自动维护:新增/修改披萨关联的配料时,只需要修改
Pizza对象的toppings属性,调用save方法即可,JPA会自动同步pizza_with_topping表的关联记录,不需要你手动操作中间表。
内容的提问来源于stack exchange,提问作者66Gramms
相关产品推荐
相关产品推荐

