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;
}
添加回答
舉報