簡體   English   中英

JPA級聯用於單向關系,而無需加載所有內容

[英]JPA cascade for unidirectional relationships without loading everything

因此,我有一些實體用作坐標系的基礎,出於這篇文章的目的,我們將它們稱為ABCD 這些實體每個都有多個@OneToMany關系,我想級聯刪除。 即,當刪除一些A ,每個@OneToMany關系中的所有實體也將被刪除。 相當標准的東西。

但是,當我要做的只是級聯刪除操作時,我看不出讓這些實體顯式跟蹤這些關系的意義。 我看不到每次將新實體添加到@OneToMany關系時將所有這些實體(可能數百萬!)都加載到內存中的@OneToMany (即使用延遲加載僅在訪問它時加載,但是當訪問一個關系中的新實體)。

讓我們添加一個小例子:

@Entity
public class A {
    @Id
    private long id;

    // ... other fields ...

    @OneToMany
    private Collection<SomeClass> collection;
}

@Entity
public class SomeClass {
    @Id
    private long id;

    // ... other fields ...

    @ManyToOne
    A a;

    @ManyToOne
    B b;

    // ... likewise for C, D ...
}

可以有多個類似於SomeClass類,因此A (和B,C,D )中的多個@OneToMany關系都需要添加。 快速乏味。 另外,每次添加SomeClass的新實例時,我都需要加載整個集合,這似乎效率極低(我最終將整個數據庫加載到內存中只是為了級聯刪除!!!) 。

在不修改底層數據庫的情況下如何實現我想要的功能(例如,在定義中指定ON DELETE CASCADE),JPA的設計人員肯定已經考慮了這種用例? 也許我不正確,將實體添加到關系中時需要加載整個集合(如果這樣,請說明原因:))。

在這里提出了類似的問題: JPA:單向多對一和級聯刪除,但是它沒有令人滿意的解決方案,也沒有討論整個關系是否加載到內存中。

要實現多級級聯而不初始化所有實體,您只能使用數據庫級聯。

沒有別的辦法了! 這就是為什么您找不到令人滿意的解決方案的原因。

至於:

另外,每次添加SomeClass的新實例時,我都需要加載整個集合,這似乎效率極低(我最終將整個數據庫加載到內存中只是為了級聯刪除!!!) 。

您需要了解單向集合分類法

  1. 向Set中添加一個元素,需要初始化整個集合以實施唯一性Set契約。

  2. java.util.Collection或未索引的List意味着您擁有一個Bag,在單向用例中效率很低。 對於逆集合,它們很好,但是這超出了您當前的上下文。

  3. 您可能正在尋找索引列表( 在數據庫中實現訂單的位置 ):

     @OrderColumn(name="orders_index") public List<Order> getOrders() { return orders; } 

索引列表將使用索引鍵進行添加/刪除/更新操作。 與僅刪除所有元素並使用剩余元素重新創建集合的Bag相比,索引List將使用索引鍵僅刪除不再屬於該List的元素。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM