2 回答

TA貢獻(xiàn)1848條經(jīng)驗(yàn) 獲得超10個(gè)贊
第一個(gè)你在命名上有一些混淆:你有Driver
& Drivers
。像這樣:
private Drivers driver;
還選擇這樣的變量名稱:
BookedBuses bookedRecord = new BookedBuses();
會(huì)造成很多混亂。不要在類型之間混合復(fù)數(shù)和單數(shù),最好不要引入可能不容易關(guān)聯(lián)的名稱,如記錄。還有這個(gè):
private List<BookedBuses> bookedBus;
應(yīng)該是這樣的:
private List<BookedBus> bookedBuses;
(并且還需要更改您的班級(jí)名稱 BookedBus -> BookedBus)
無論如何,實(shí)際問題似乎在這里:
Drivers drivers = new Drivers(booking.getDriver().getId());
您需要在存儲(chǔ)庫的幫助下按 id 獲取現(xiàn)有實(shí)體,而不是使用現(xiàn)有的 id 創(chuàng)建一個(gè)新實(shí)體。所以像:
Drivers drivers = driverRepo.findOne(booking.getDriver().getId()); // or findById(..)
似乎您有一個(gè)構(gòu)造函數(shù)(您沒有顯示),可以創(chuàng)建具有 id 的驅(qū)動(dòng)程序。沒有管理它被認(rèn)為是分離的。(你也有drivers.addBooked(bookedRecord);
你沒有分享的,但也許是微不足道的)
另請(qǐng)注意,一些帖子建議根據(jù)您的需要更改CascadeType.ALL
是否CascadeType.MERGE
有效。Spring 數(shù)據(jù)能夠save(..)
基于實(shí)體 id 進(jìn)行一些合并,但在這種情況下不一定。

TA貢獻(xiàn)1794條經(jīng)驗(yàn) 獲得超8個(gè)贊
這條線
Drivers drivers = new Drivers(booking.getDriver().getId());
如果您已經(jīng)擁有可用的驅(qū)動(dòng)程序 ID,則無需再次從數(shù)據(jù)庫中提取驅(qū)動(dòng)程序 ID。
從&中刪除Cascade屬性后,您的代碼應(yīng)該可以工作。@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;
}
添加回答
舉報(bào)