2011-05-15 12 views
7

Bu soruya daha önce defalarca sorulmuştur, ancak tatmin edici bir yanıt görmedim, bu yüzden tekrar soruyorum.Hazırda bekletme silme ile ilgili sorunlar Hazırda bekletme

public class User { 
    ... 

    @Cascade(value= {CascadeType.DELETE}) 
    @OneToMany(fetch = FetchType.LAZY) 
    @JoinColumn(name="followerId") 
    public List<LocationFollower> followedLocations; 

    ... 
} 

public class LocationFollower { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "id", nullable = false) 
    public Long id; 

    @ManyToOne 
    @JoinColumn(name="locationId") 
    public Location followedLocation; 

    @ManyToOne 
    @JoinColumn(name="followerId") 
    public User follower; 

    @Column(name = "followerSince") 
    public Timestamp followerSince; 
} 

public class Location { 
    ... 

    @Cascade(value = {CascadeType.DELETE}) 
    @OneToMany(fetch= FetchType.LAZY) 
    @JoinColumn(name="locationId") 
    public List<LocationFollower> followers; 

    ... 
} 

Bütün istediğim bir kullanıcıyı silmek oldu:

şu durumu düşünün. Mantıksal olarak, Kullanıcı ve Konum'u bağlayan tüm ilgili "takipçi" girişleri silinecektir. Bir Konum girdisini sildiysem de aynı varsayımda kalmalıdır.

Aslında ne olur? Hazırda bekletme, takipçileri tutan tabloyu (?!?) Güncelleştirmeye çalışır ve ilgili varlık (Kullanıcı veya Konum) silme için gönderildiğinden, örneğin bir yabancı anahtar ayarlamaya çalışır. null ile followerId. Bu bir istisna atar ve tüm başarılı işlemleri patlatır.

Aldığım hata: Sunucuda işlenmeyen bir hata oluştu. JDBC toplu güncelleştirmesi yürütülemedi; SQL [update locationstofollowers followerId ayarlamak = null followerId =?]; sınırlama [boş]; iç içe istisna org.hibernate.exception.ConstraintViolationException: JDBC toplu güncelleştirmesi

S.S. Ben DELETE_ORPHAN başka bir basamaklı seçeneği olduğunu duydum. Bu göz ardı edilmiş gibi görünüyor ve ben de denedim olsa bile, etki aynıydı.

+0

Mükemmel soruyu belirlesin. Ne yazık ki bu konuda çok fazla tartışma gerçekleşmedi. – pavanlimo

cevap

1

İki yönlü bir eşleme yaptığınızdan, nesneyi iki yerden de kaldırmanız gerekir. Bu çalışması gerekir:

user.followedLocations.remove(aLocation); 
session.update(user); 
session.delete(aLocation); 
+0

Bu, kuplaj oluşturamaz. – xantrus

+1

değil, haritalama iki yönlü olarak yapıldı, sorun burada kullanıcı nesnesi, null olarak değil null olarak eşlenmiş .. Bu soruna neden oluyor ... sorun da kararsız Bu alan için boş değil ... –

+0

Harika çalışıyor. Teşekkürler Anantha! Keşke @xantrus bu cevabı kabul eder ve kapatır. – pavanlimo

0

Sen @JoinColumn (name = "followerId" sokulabilir = false false = güncellenebilir)