2 回答

TA贡献1848条经验 获得超10个赞
第一个你在命名上有一些混淆:你有Driver
& Drivers
。像这样:
private Drivers driver;
还选择这样的变量名称:
BookedBuses bookedRecord = new BookedBuses();
会造成很多混乱。不要在类型之间混合复数和单数,最好不要引入可能不容易关联的名称,如记录。还有这个:
private List<BookedBuses> bookedBus;
应该是这样的:
private List<BookedBus> bookedBuses;
(并且还需要更改您的班级名称 BookedBus -> BookedBus)
无论如何,实际问题似乎在这里:
Drivers drivers = new Drivers(booking.getDriver().getId());
您需要在存储库的帮助下按 id 获取现有实体,而不是使用现有的 id 创建一个新实体。所以像:
Drivers drivers = driverRepo.findOne(booking.getDriver().getId()); // or findById(..)
似乎您有一个构造函数(您没有显示),可以创建具有 id 的驱动程序。没有管理它被认为是分离的。(你也有drivers.addBooked(bookedRecord);
你没有分享的,但也许是微不足道的)
另请注意,一些帖子建议根据您的需要更改CascadeType.ALL
是否CascadeType.MERGE
有效。Spring 数据能够save(..)
基于实体 id 进行一些合并,但在这种情况下不一定。

TA贡献1794条经验 获得超8个赞
这条线
Drivers drivers = new Drivers(booking.getDriver().getId());
如果您已经拥有可用的驱动程序 ID,则无需再次从数据库中提取驱动程序 ID。
从&中删除Cascade属性后,您的代码应该可以工作。@OneToMany@ManyToOne
@Entity
@Table(name = "bookedBuses")
public class BookedBuses implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
`
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "driver_id")
private Drivers driver;
}
@Entity
public class Drivers implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name = "driver_id")
private List<BookedBuses> bookedBus;
}
添加回答
举报