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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 06:02:16