如何在Spring Boot中实现User与Flight的多对多映射及Booking实体创建
实现用户与航班的预订关联(多对多映射)
要实现用户和航班的预订记录管理,由于需要独立存储预订相关的信息(比如预订时间、座位号等),我们需要用显式的Booking实体来实现带额外属性的多对多关联,而不是JPA默认的隐式连接表。以下是具体实现步骤:
1. 创建Booking实体
这个实体作为用户和航班之间的关联载体,同时可以存储预订的专属信息。核心是通过@ManyToOne关联User和Flight实体:
@Entity @Table(name = "Booking") @Getter @Setter public class Booking { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long bookingId; // 关联用户实体 @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "user_id", nullable = false) private User user; // 关联航班实体 @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "flight_id", nullable = false) private Flight flight; // 预订时间(示例额外字段,可根据需求添加) @Column(nullable = false) private LocalDateTime bookingTime; // 注意:不建议重复存储username和flightNumber // 可通过关联实体获取:booking.getUser().getUsername() / booking.getFlight().getFlightNumber() // 若业务强制要求存储,可添加字段,但需保证数据同步 public Booking() {} public Booking(User user, Flight flight, LocalDateTime bookingTime) { this.user = user; this.flight = flight; this.bookingTime = bookingTime; } }
2. 修改User实体,添加预订关联
在User类中添加一对多关联,用于维护该用户的所有预订记录:
@Entity @Table(name = "User", uniqueConstraints = @UniqueConstraint(columnNames = "username")) @Getter @Setter public class User { // 原有字段保持不变... // 用户的所有预订记录 @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true) private List<Booking> bookings = new ArrayList<>(); // 便捷方法:添加预订 public void addBooking(Booking booking) { bookings.add(booking); booking.setUser(this); } // 便捷方法:移除预订 public void removeBooking(Booking booking) { bookings.remove(booking); booking.setUser(null); } }
3. 修改Flight实体,添加预订关联
同样在Flight类中添加一对多关联,维护该航班的所有预订记录:
@Entity @Table(name = "Flight" , uniqueConstraints = @UniqueConstraint(columnNames = "flightNumber")) @Getter @Setter public class Flight { // 原有字段保持不变... // 航班的所有预订记录 @OneToMany(mappedBy = "flight", cascade = CascadeType.ALL, orphanRemoval = true) private List<Booking> bookings = new ArrayList<>(); // 便捷方法:添加预订 public void addBooking(Booking booking) { bookings.add(booking); booking.setFlight(this); } // 便捷方法:移除预订 public void removeBooking(Booking booking) { bookings.remove(booking); booking.setFlight(null); } }
关键细节说明
FetchType.LAZY:设置为懒加载,避免加载User或Flight时自动查询所有关联的预订,提升查询性能。cascade = CascadeType.ALL:当保存/删除User或Flight时,自动同步处理关联的Booking记录。若删除用户时需保留预订数据,可调整为CascadeType.PERSIST等更合适的级联策略。orphanRemoval = true:当从User或Flight的预订列表中移除某个Booking时,自动删除数据库中对应的预订记录。- 避免数据冗余:不要在
Booking中重复存储username和flightNumber,通过关联实体获取即可,防止数据不一致。
示例:创建预订记录
// 从数据库获取用户和航班 User user = userRepository.findByUsername("hisham"); Flight flight = flightRepository.findByFlightNumber("EK201"); // 创建并保存预订 Booking booking = new Booking(user, flight, LocalDateTime.now()); bookingRepository.save(booking);
内容的提问来源于stack exchange,提问作者Hisham Gundagi
相关产品推荐
相关产品推荐

