JPA CascadeType.ALL öksüzleri silmez


132

Aşağıdaki eşlemeyle JPA kullanarak öksüz düğümleri silerken sorun yaşıyorum

@OneToMany (cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "owner")
private List<Bikes> bikes;

Veritabanında kalan öksüz roller sorunu yaşıyorum.

org.hibernate.annotations.CascadeHazırda Bekletme'ye özel ek açıklamayı kullanabilirim ancak açıkçası çözümümü bir Hazırda Bekletme uygulamasına bağlamak istemiyorum.

DÜZENLEME : Görünüşe göre JPA 2.0 bunun için destek içerecek.

Yanıtlar:


164

Hazırda Bekletme ile kullanıyorsanız CascadeType.DELETE_ORPHAN, JPA ile birlikte kullanılabilecek ek açıklamayı açıkça tanımlamanız gerekir CascadeType.ALL.

Hazırda Bekletme'yi kullanmayı planlamıyorsanız, herhangi bir artık kayıtlardan kaçınmak için önce alt öğeleri ve ardından ana kaydı silmeniz gerekir.

yürütme sırası

  1. silinecek ana satırı getir
  2. alt öğeleri getir
  3. tüm alt öğeleri sil
  4. ana satırı sil
  5. yakın oturum

JPA 2.0 ile artık orphanRemoval = true seçeneğini kullanabilirsiniz.

@OneToMany(mappedBy="foo", orphanRemoval=true)

3
Teşekkürler Bu rotaya gitmeyi bıraktım, sanırım bu JPA spesifikasyonu için biraz abartılı.
Paul Whelan

13
JPA 2.0 standardı artık @OneToMany'nin bir özniteliği olarak deleteOrphan'a sahiptir En son hazırda bekletmeyi kullanıyorsanız @OneToMany yapabilirsiniz (..., deleteOrphan = true)
jomohke

sadece alt öğeleri güncellediğimde yürütme sırası nedir? yetim kayıtları silinecek mi?
jAckOdE

113

JPA 2.0 kullanıyorsanız, artık ek açıklamanın orphanRemoval=trueözniteliğini @xxxToManyöksüzleri kaldırmak için kullanabilirsiniz .

Aslında, CascadeType.DELETE_ORPHAN3.5.2-Final'de kullanımdan kaldırıldı.


6
Aslında orphanRemoval = true başka bir anlama geliyor, yani bir nesneyi ebeveynin koleksiyonundan kaldırdığımda siliyorum. Download.oracle.com/javaee/6/tutorial/doc/bnbqa.html#giqxy
Archie

Lütfen Archie'nin bağlantısına gidin.
Jigar Shah

4
orphanRemoval = true da çalışmıyor. Eski yöntemle yapılmalı.
Joe Almore

45
╔═════════════╦═════════════════════╦═════════════════════╗
   Action      orphanRemoval=true    CascadeType.ALL   
╠═════════════╬═════════════════════╬═════════════════════╣
   delete         deletes parent      deletes parent   
   parent         and orphans         and orphans      
╠═════════════╬═════════════════════╬═════════════════════╣
   change                                              
  children      deletes orphans         nothing        
    list                                               
╚═════════════╩═════════════════════╩═════════════════════╝

1
cascade = CascadeType.ALL, orphanRemoval = falseEbeveyni alırsam ve silersem ne olur ? Özellikle YAPMAMAMI söylememe rağmen çocukları silecek mi?
izogfif


7

öksüzleri silmek için @PrivateOwned kullanabilirsiniz, örneğin

@OneToMany(mappedBy = "masterData", cascade = {
        CascadeType.ALL })
@PrivateOwned
private List<Data> dataList;

5
Teşekkürler @reshma, not edilmelidir @PrivateOwned bir eclipselink JPA uzantısıdır.
Paul Whelan

5

Sadece bu çözümü buluyorum ama benim durumumda işe yaramıyor:

@OneToMany(cascade = CascadeType.ALL, targetEntity = MyClass.class, mappedBy = "xxx", fetch = FetchType.LAZY, orphanRemoval = true) 

orphanRemoval = true hiçbir etkiye sahip değildir.


1
Değişiklik yürürlüğe girmeden önce temizlemem ve inşa etmem gerekiyordu.
maralbjo

Vay canına, ManyToOne cihazıma CascadeType.ALL eklemenin neden silme işlemlerini basamaklandırmadığını öğrenmek için bir saat aradım. Temizlendi ve inşa edildi ve çalışıyor. Teşekkürler @maralbjo.
Andrew Mairose


2

Ben de aynı sorunu yaşadım ve aşağıdaki durumun neden yetimleri silmediğini merak ettim. Hazırda bekletme modunda (5.0.3.Final), adlandırılmış bir silme sorgusu yürüttüğümde yemeklerin listesi silinmedi:

@OneToMany(mappedBy = "menuPlan", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Dish> dishes = new ArrayList<>();

Sonra , adlandırılmış bir silme sorgusu değil, EntityManager kullanmam gerektiğini hatırladım . EntityManager.find(...)Öğeyi almak ve ardından EntityManager.remove(...)silmek için yöntemi kullandığım için yemekler de silindi.


2

Sadece @OneToMany(cascade = CascadeType.ALL, mappedBy = "xxx", fetch = FetchType.LAZY, orphanRemoval = true).

TargetEntity = MyClass.class'ı kaldırın , harika çalışıyor.



0

Bire bir eşleme kullanıyordum, ancak çocuk silinmiyordu, JPA yabancı anahtar ihlali veriyordu

OrphanRemoval = true kullandıktan sonra sorun çözüldü


@OneToOne (cascade = CascadeType.ALL, orphanRemoval = true) @JoinColumn (name = "CHILD_OID") özel Alt çocuk;
vipin chauhan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.