在Spring Boot中使用deleteById與一對多關系生成的查詢嘗試將引用實體中的外鍵設置為null,而不是刪除它們。我正在使用默認存儲庫deleteById我已在實體中的外鍵定義中將 Cascadetype 設置為 ALL,將 OrpahnRemoval 設置為 true,并在創建表的 DDL 中設置 ON DELETE CASCADE。這里是controller類中的刪除操作@Transactional@DeleteMapping("transferImage/{imageId}")public void deleteTransferImage(@PathVariable int imageId) { repository.deleteById(imageId);}這是從父實體到子實體的引用@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, OrphanRemoval = true)@JoinColumn(name = "TRANSFER_IMAGE_ID")private List<TransferPartition> partitions = new ArrayList<>();這是子實體中外鍵的定義@JsonIgnore@ManyToOne@JoinColumn(name = "TRANSFER_IMAGE_ID", referencedColumnName = "TRANSFER_IMAGE_ID")private TransferImage image;這是用于創建兩個表的 DDLCREATE TABLE TRANSFER_IMAGE (TRANSFER_IMAGE_ID SERIAL CONSTRAINT TRANSFER_IMAGE_PK PRIMARY KEY,IMAGE_NAME VARCHAR(50) CONSTRAINT TRANSFER_IMAGE_NAME_UK UNIQUE NOT NULL ,REQUESTED_PART_SIZE_MB INTEGER NOT NULL,SIZE_BYTES INTEGER NOT NULL,IMAGE_MD5_HASH VARCHAR(100),NUMBER_PARTITIONS INTEGER,DELETED BOOLEAN NOT NULL);CREATE TABLE TRANSFER_PARTITION (TRANSFER_PARTITION_ID SERIAL CONSTRAINT TRANSFER_PARTITION_PK PRIMARY KEY,TRANSFER_IMAGE_ID INTEGER NOT NULL CONSTRAINT TRANSFER_PARTITION_IMAGE_FK REFERENCES TRANSFER_IMAGE ON DELETE CASCADE ON UPDATE CASCADE,PARTITION_NUMBER INTEGER NOT NULL,PARTITION_MD5_HASH VARCHAR(100) NOT NULL,SIZE_BYTES INTEGER NOT NULL);
1 回答

qq_遁去的一_1
TA貢獻1725條經驗 獲得超8個贊
您的問題在于 TransferImage 類中外鍵關系的定義。
代替
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, OrphanRemoval = true)
@JoinColumn(name = "TRANSFER_IMAGE_ID")
private List<TransferPartition> partitions = new ArrayList<>();
你應該使用
@OneToMany(mappedBy="image", cascade = CascadeType.ALL, fetch = FetchType.EAGER, OrphanRemoval = true)
private List<TransferPartition> partitions = new ArrayList<>();
添加回答
舉報
0/150
提交
取消