2010-06-14 19 views
6

aşağıdaki JPA ek açıklamalarla, iki Varlıkları vardır:@OneToOne ve @JoinColumn, otomatik silme null varlığı, doable?

@Entity 
@Table(name = "Owner") 
public class Owner implements Serializable 
{ 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "id") 
    private long id; 

    @OneToOne(fetch=FetchType.EAGER , cascade=CascadeType.ALL) 
    @JoinColumn(name="Data_id") 
    private Data Data; 
} 

@Entity 
@Table(name = "Data") 
public class Data implements Serializable 
{ 
    @Id 
    private long id; 
} 

Sahibi ve Veri bire bir eşleme vardır, sahibi olan tarafı sahibidir. Yürütme sırasında sorun oluştu: owner.setData (null); ownerDao.update (sahip); "Sahip" tablosunun Data_id değeri boş, bu doğru.

Ancak "Veri" satırı otomatik olarak silinmez. Başka bir DataDao ve iki eylemi sarmak için başka bir hizmet katmanı yazmam gerekiyor (ownerDao.update (owner); dataDao.delete (data);)

Bir veri satırı, sahip olunca otomatik olarak silinebilir mi? Sahibi null olarak ayarladı? senin hazırda sürümüne bağlı

cevap

8

kullanın:

cascadeType kullanın: @OneToOne notu üzerine DELETE_ORPHAN veya orphanRemoval = true

belgeleri: Ben OneToOne üzerinde hiç denemedim http://docs.jboss.org/hibernate/core/3.3/reference/en/html/objectstate.html#objectstate-transitive

, ama doktora çalışmalı. DÜZENLEME

@OneToOne(fetch=FetchType.EAGER , cascade=CascadeType.ALL, orphanRemoval=true) 
@JoinColumn(name="Data_id") 
private Data Data; 

@OneToOne(fetch=FetchType.EAGER , cascade=CascadeType.ALL) 
@JoinColumn(name="Data_id") 
@org.hibernate.annotations.Cascade({org.hibernate.annotations.CascadeType.DELETE_ORPHAN}) 
private Data Data; 

veya

: i SO sonrası buldum: Workarounds for Hibernate's lack of delete-orphan support for one-to-one and many-to-one relationships?

Yani perhap işe yaramıyor bu. İki cevap, ancak iki farklı çözümü açıklar.

+2

Teşekkür ederim, işe yarıyor! Ve ... CascadeType.DELETE_ORPHAN, kullanımdan kaldırıldı. @OneToOne ile değiştirilmiştir (fetch = FetchType.EAGER, kaskad = CascadeType.ALL, artıkRemoval = doğru) – smallufo

+0

FetchType.EAGER, yetim kaldırma işlemi için çok önemlidir. FetchType.LAZY yetim kaldırma işlemi çalışmıyor. Hazırda sürümü 4.3.10.FINAL. –

+0

Hazırda Bekletme 5.0.11.FINAL kullanma, bu benim için @OneToOne (cascade = CascadeType.ALL, artıkRemoval = true) 'için yeterliydi. "FetchType.LAZY" veya "FetchType.EAGER" kullanarak başarı elde ettim. "EAGER" varsayılan. –

İlgili konular