3 回答

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超10個(gè)贊
如果您想刪除 的對(duì)象B,只要關(guān)聯(lián)的對(duì)象A被刪除(這是您的愿望清單的第四點(diǎn):
我想要一個(gè)級(jí)聯(lián)刪除,刪除相關(guān)的b何時(shí)a被刪除
那么您需要將映射更改A為:
@OneToOne(cascade = CascadeType.REMOVE, orphanRemoval = true)
@PrimaryKeyJoinColumn
private B b;

TA貢獻(xiàn)1793條經(jīng)驗(yàn) 獲得超6個(gè)贊
就您實(shí)現(xiàn)的 MySQL 方面而言,表 B 中的記錄對(duì)表 A 中的任何記錄都沒(méi)有“知識(shí)”。在數(shù)據(jù)庫(kù)中,關(guān)系是單向的
存在本機(jī)級(jí)聯(lián)功能以防止外鍵錯(cuò)誤,通過(guò)告訴數(shù)據(jù)庫(kù)在刪除記錄時(shí)要做什么會(huì)使外鍵無(wú)處指向。刪除表 A 記錄不會(huì)導(dǎo)致任何表 B 記錄中的外鍵錯(cuò)誤,因此不會(huì)觸發(fā)任何本機(jī)級(jí)聯(lián)功能
重申;您不能保持模式相同,并且從a
to級(jí)聯(lián)刪除b
,因?yàn)槟鷮?shí)際上沒(méi)有從a
to級(jí)聯(lián)刪除b
您還在評(píng)論中提到,一些表 B 記錄可以存在而沒(méi)有表 A 記錄,而表 A 記錄不在原始問(wèn)題中
要獲得您描述的表 B 記錄的自動(dòng)刪除,您有幾個(gè)關(guān)于數(shù)據(jù)庫(kù)的選項(xiàng):
交換關(guān)系- 刪除當(dāng)前外鍵并在表 B 中添加一個(gè)可以為空的外鍵列,該列引用表 A 的主鍵。然后您可以在此外鍵上進(jìn)行級(jí)聯(lián)刪除。對(duì)于不“屬于”表 A 記錄的表 B 記錄,保持新列為空。您還可以向此列添加唯一索引以確保一對(duì)一關(guān)系
添加數(shù)據(jù)庫(kù)觸發(fā)器- 刪除表 A 記錄時(shí),添加刪除引用的表 B 記錄的數(shù)據(jù)庫(kù)觸發(fā)器
添加一個(gè) DB 過(guò)程- 添加一個(gè)過(guò)程,刪除表 A 記錄,然后依次刪除引用的表 B 記錄,可能在事務(wù)中。繼續(xù)前進(jìn),僅使用該過(guò)程刪除表 A 記錄
不要在 DB 層面解決問(wèn)題- 與選項(xiàng) 3 基本相同,但將過(guò)程邏輯從 DB 層移到應(yīng)用程序邏輯中
JPA 中可能有一些東西可以開(kāi)箱即用地解決您的困境,但在幕后它將執(zhí)行上述操作之一(不是選項(xiàng) 1,可能是選項(xiàng) 4)

TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超4個(gè)贊
為了實(shí)現(xiàn)您的要求,我對(duì)您的表格進(jìn)行了如下調(diào)整:
CREATE TABLE b (
dbid INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY
);
CREATE TABLE a (
b_id int(11) NOT NULL PRIMARY KEY REFERENCES b(dbid) ON DELETE CASCADE
);
CASCADE DELETE沒(méi)有添加到您的 DDL 中。
這將啟用級(jí)聯(lián)刪除。要?jiǎng)h除刪除b記錄,a我在課堂上做了以下更改A:
@Entity
@Table(name = "a")
public class A {
@Id
@Column(name = "b_id")
@GeneratedValue(generator = "gen")
@GenericGenerator(name = "gen", strategy = "foreign", parameters = @Parameter(name="property", value="b"))
private Integer bId;
@OneToOne(cascade = CascadeType.REMOVE, orphanRemoval = true)
@PrimaryKeyJoinColumn
private B b;
}
在此處找到工作解決方案的鏈接。
添加回答
舉報(bào)