亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

JPA 錯誤:InvalidDataAccessApiUsageException:

JPA 錯誤:InvalidDataAccessApiUsageException:

小唯快跑啊 2022-05-25 16:42:37
我有兩個實體使用oneToMany注釋相互映射。一個實體是bookedBus,第二個是drivers驅動程序實體已經插入了一行,該行稍后將成為bookedBus 實體(PK) 的外部引用(FK)。下面是兩個實體,為簡潔起見,setter 和 getter 已被跳過。第一個實體@Entity@Table(name = "bookedBuses")public class BookedBuses implements Serializable {    @Id    @GeneratedValue(strategy = GenerationType.IDENTITY)    private Long id;    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)    @JoinColumn(name = "driver_id")    private Drivers driver;}第二實體@Entitypublic class Drivers implements Serializable {    @Id    @GeneratedValue(strategy = GenerationType.IDENTITY)    private Long id;    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "driver")    private List<BookedBuses> bookedBus;}現在,當我嘗試保存到預訂的巴士實體時,它會引發以下異常org.springframework.dao.InvalidDataAccessApiUsageException:分離的實體傳遞給堅持:com.bus.api.entity.Drivers;嵌套異常是 org.hibernate.PersistentObjectException:分離的實體傳遞給堅持:com.bus.api.entity.Drivers以下是我嘗試保存到bookedBus 實體的方法BookedBuses bookedRecord = new BookedBuses();bookedRecord.setBookedSeats(1);bookedRecord.setBookedBusState(BookedBusState.LOADING);      bookedRecord.setBus(busService.getBusByPlateNumber(booking.getPlateNumber()));bookedRecord.setRoute(booking.getRoute()); infoLogger.info("GETTING DRIVER ID ======= " +    booking.getDriver().getId()); Drivers drivers = new Drivers(booking.getDriver().getId()); List<BookedBuses> d_bu = new ArrayList<>(); drivers.setBooked(d_bu); drivers.addBooked(bookedRecord); bookedRecord.setDriver(drivers); bookedBusService.save(bookedRecord);My BookBusService 按要求保存方法@Autowiredprivate BookedBusRepository bookedBusRepo;public boolean save(BookedBuses bookedRecord) {    try {        bookedBusRepo.save(bookedRecord);        return true;    } catch (DataIntegrityViolationException ex) {        System.out.println(ex);        AppConfig.LOGGER.error(ex);        return false;        // Log error message    }}
查看完整描述

2 回答

?
慕桂英546537

TA貢獻1848條經驗 獲得超10個贊

第一個你在命名上有一些混淆:你有DriverDrivers。像這樣:

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 進行一些合并,但在這種情況下不一定。


查看完整回答
反對 回復 2022-05-25
?
幕布斯7119047

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;

}


查看完整回答
反對 回復 2022-05-25
  • 2 回答
  • 0 關注
  • 348 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號