2010-06-14 3 views
6

ho due entità, con le seguenti annotazioni APP:@OneToOne e @JoinColumn, eliminazione automatica entità nulla, fattibile?

@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; 
} 

proprietario e dati sono mappatura uno-a-uno, il lato proprietario è proprietario. Il problema si verifica quando eseguo: owner.setData (null); ownerDao.update (owner); Il Data_id della tabella "Proprietario" diventa nullo, è corretto.

Ma la riga "Dati" non viene cancellata automaticamente. Devo scrivere un altro DataDao e un altro livello di servizio per avvolgere le due azioni (proprietarioDao.update (proprietario); dataDao.delete (dati);)

E 'possibile fare una riga di dati cancellata automaticamente quando il proprietario Il proprietario lo ha impostato su null?

risposta

8

seconda della versione di Hibernate, utilizzare:

utilizzare il cascadeType: DELETE_ORPHAN o orphanRemoval = true sul annotazione @OneToOne

documentazione: http://docs.jboss.org/hibernate/core/3.3/reference/en/html/objectstate.html#objectstate-transitive

ho mai provato su OnetoOne, ma dal doc, dovrebbe funzionare.

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

o

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

EDIT: Ho trovato questo SO messaggio: Workarounds for Hibernate's lack of delete-orphan support for one-to-one and many-to-one relationships?

è Così perhap non funziona. Le due risposte descrivono tuttavia due soluzioni alternative.

+2

Grazie, funziona !!! E ... CascadeType.DELETE_ORPHAN è obsoleto. È sostituito da @OneToOne (fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true) – smallufo

+0

FetchType.EAGER è essenziale per la rimozione degli orfani a quanto pare. La rimozione orfana FetchType.LAZY non funziona. Hibernate versione 4.3.10.FINAL. –

+0

Utilizzando Hibernate 5.0.11.FINAL, questo è stato sufficiente per me '@OneToOne (cascade = CascadeType.ALL, orphanRemoval = true)'. Ho avuto successo usando 'FetchType.LAZY' o' FetchType.EAGER'. 'EAGER' è il valore predefinito. –