2 回答

TA貢獻(xiàn)1943條經(jīng)驗(yàn) 獲得超7個(gè)贊
當(dāng)我們說 Errors 是擁有方時(shí),這意味著關(guān)系的外鍵位于 Errors 表中(您正在通過@JoinColumn
)。因此,關(guān)系的擁有方是另一個(gè)實(shí)體的引用列將出現(xiàn)的一方。您可以通過@OneToMany
在 Transactions 實(shí)體中指定來定義關(guān)系的反面。
現(xiàn)在是關(guān)于交易和錯(cuò)誤更新的問題的第二部分。在我看來,您可以通過應(yīng)用適當(dāng)?shù)募?jí)聯(lián)模式(持久、刪除等)來更新與事務(wù)關(guān)聯(lián)的列表,這意味著您可以在@OneToMany(cascade=CASCADETYPE.MERGE)
指定反向關(guān)系的同時(shí)在事務(wù)實(shí)體中指定。這樣,如果每當(dāng)您更新一個(gè)事務(wù)行時(shí),也可以更新相應(yīng)的錯(cuò)誤行。
但是,我認(rèn)為以其他方式級(jí)聯(lián)不是一個(gè)好習(xí)慣,即如果您更新子實(shí)體,則父實(shí)體也應(yīng)該更新,因?yàn)樗赡軙?huì)導(dǎo)致許多數(shù)據(jù)不一致

TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超10個(gè)贊
在非雙向關(guān)系中,您定義一個(gè)映射。當(dāng)您對(duì)該映射進(jìn)行更改時(shí),很明顯會(huì)發(fā)生什么 - 外鍵將被更新。因?yàn)橹挥幸粋€(gè)映射,所以不會(huì)有沖突(許多 JPA 提供程序如果檢測(cè)到您有多個(gè)可寫的字段映射,就會(huì)拋出錯(cuò)誤)。
對(duì)于雙向關(guān)系,這種控制不太明顯。在您的 transaction-Error 雙向關(guān)系中,假設(shè)它是一個(gè) OneToOne 雙向映射,并且 Transaction1 設(shè)置為指向 Error1,反之亦然。假設(shè)您的應(yīng)用程序確定 Transaction1 應(yīng)該指向 Error2,并更改引用。如果 Error1 對(duì) Transaction1 的引用沒有更正以反映這種情況,那么 JPA 在確定將什么值放入外鍵時(shí)就會(huì)出現(xiàn)問題。這就是所有權(quán)發(fā)揮作用的地方。擁有方被認(rèn)為是可寫的映射,對(duì)它的更改控制外鍵字段。在 OneToMany 中,擁有方通常是 ManyToOne 反向引用,因?yàn)樗匀?,因?yàn)橥怄I無論如何都在持有 ManyToOne 的表中。
級(jí)聯(lián)與所有權(quán)無關(guān)。它只是意味著操作(持久化、合并、刪除、刷新)適用于關(guān)系引用的實(shí)體。如果使用cascade.all 調(diào)用em.refresh(transaction),事務(wù)和所有引用的錯(cuò)誤將從數(shù)據(jù)庫(kù)中刷新。任何具有 ALL 或 REFRESH 級(jí)聯(lián)設(shè)置的 Error 關(guān)系也將被刷新,依此類推。如果你把它放在后面的引用上,JPA 應(yīng)該檢測(cè)到它已經(jīng)刷新了引用的 Transaction 實(shí)例,但為什么要冒險(xiǎn)呢。通常,級(jí)聯(lián)選項(xiàng)應(yīng)僅放置在需要避免意外后果的映射上。如果您不確定是否需要它,請(qǐng)?jiān)诖_定之前將其關(guān)閉。
在您的示例中,您可能會(huì)在應(yīng)用程序?qū)鬟f的根實(shí)體上進(jìn)行級(jí)聯(lián)合并。對(duì)該圖所做的任何更改都可以通過單個(gè)合并調(diào)用輕松獲取,而無需在每個(gè)單獨(dú)的葉子上調(diào)用合并。您的模型的構(gòu)建和序列化方式會(huì)影響合并,因此通常級(jí)聯(lián)選項(xiàng)僅放在根-> 葉關(guān)系上,以避免出現(xiàn)根-> 葉-> root' where root != root' 的問題。如果雙方都有級(jí)聯(lián)合并,則 root' 的狀態(tài)可能會(huì)覆蓋您在 root 中的更改。
添加回答
舉報(bào)