第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

Spring JPA OneToOne FK 作為 PK Cascade.Remove

Spring JPA OneToOne FK 作為 PK Cascade.Remove

浮云間 2022-05-12 18:56:13
我有兩張桌子,b并且a:它們具有一對(duì)一的雙向關(guān)系a有一個(gè)外鍵來(lái)b定義這種關(guān)系這個(gè)外鍵也被認(rèn)為是a, 和 JPA的主鍵@ID我想要一個(gè)級(jí)聯(lián)刪除,刪除相關(guān)的b何時(shí)a被刪除在 MySQL 中,a'sb_id是NOT NULL問(wèn)題是當(dāng)我A使用 JPA 存儲(chǔ)庫(kù)刪除我的對(duì)象時(shí),我會(huì)ConstraintViolationException在其外鍵上得到一個(gè)。我希望a和b行都被刪除(巧妙地從a's 開(kāi)始)。知道我想保留,我怎么能解決這個(gè)問(wèn)題:我的數(shù)據(jù)庫(kù)架構(gòu)相同a從到的級(jí)聯(lián)刪除bidb是 JPA@Id的aCREATE TABLE `b` (  `dbid` int(11) NOT NULL AUTO_INCREMENT,  PRIMARY KEY (`dbid`),);CREATE TABLE `a` (  `b_id` int(11) NOT NULL,  KEY `b_fk` (`b_id`),  CONSTRAINT `b_fk` FOREIGN KEY (`b_id`) REFERENCES `b` (`dbid`),);@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)    @PrimaryKeyJoinColumn    private B b;}@Entity@Table(name = "b")public class B {    @Id    @GeneratedValue(strategy= GenerationType.IDENTITY)    @Column(name = "dbid")    private Integer id;    @OneToOne(mappedBy = "b")    private A a;}[編輯] 在回答評(píng)論和重新閱讀我的問(wèn)題的所有討論之后,這些提案orphanRemoval確實(shí)在范圍和工作中。
查看完整描述

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;


查看完整回答
反對(duì) 回復(fù) 2022-05-12
?
搖曳的薔薇

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)功能

重申;您不能保持模式相同,并且從ato級(jí)聯(lián)刪除b,因?yàn)槟鷮?shí)際上沒(méi)有從ato級(jí)聯(lián)刪除b

您還在評(píng)論中提到,一些表 B 記錄可以存在而沒(méi)有表 A 記錄,而表 A 記錄不在原始問(wèn)題中

要獲得您描述的表 B 記錄的自動(dòng)刪除,您有幾個(gè)關(guān)于數(shù)據(jù)庫(kù)的選項(xiàng):

  1. 交換關(guān)系- 刪除當(dāng)前外鍵并在表 B 中添加一個(gè)可以為空的外鍵列,該列引用表 A 的主鍵。然后您可以在此外鍵上進(jìn)行級(jí)聯(lián)刪除。對(duì)于不“屬于”表 A 記錄的表 B 記錄,保持新列為空。您還可以向此列添加唯一索引以確保一對(duì)一關(guān)系

  2. 添加數(shù)據(jù)庫(kù)觸發(fā)器- 刪除表 A 記錄時(shí),添加刪除引用的表 B 記錄的數(shù)據(jù)庫(kù)觸發(fā)器

  3. 添加一個(gè) DB 過(guò)程- 添加一個(gè)過(guò)程,刪除表 A 記錄,然后依次刪除引用的表 B 記錄,可能在事務(wù)中。繼續(xù)前進(jìn),僅使用該過(guò)程刪除表 A 記錄

  4. 不要在 DB 層面解決問(wèn)題- 與選項(xiàng) 3 基本相同,但將過(guò)程邏輯從 DB 層移到應(yīng)用程序邏輯中

JPA 中可能有一些東西可以開(kāi)箱即用地解決您的困境,但在幕后它將執(zhí)行上述操作之一(不是選項(xiàng) 1,可能是選項(xiàng) 4)


查看完整回答
反對(duì) 回復(fù) 2022-05-12
?
慕萊塢森

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;

}

在此處找到工作解決方案的鏈接。


查看完整回答
反對(duì) 回復(fù) 2022-05-12
  • 3 回答
  • 0 關(guān)注
  • 132 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)