2015-07-17 14 views
10

Qualcuno ha una soluzione alternativa per questo problema: https://hibernate.atlassian.net/browse/HHH-9663?La rimozione orfana JPA non funziona per le relazioni OneToOne

Anche io sto affrontando un problema simile. Quando ho creato una relazione unilaterale (senza riferimenti inversi) tra due entità e ho impostato l'attributo di rimozione orfano su true, l'oggetto di riferimento è ancora nel database dopo aver impostato il riferimento su null.

Ecco il modello di dominio del campione:

@Entity 
public class Parent { 
    ... 
    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true) 
    @JoinColumn(name = "child_id") 
    private Child child; 
    ... 
} 

@Entity 
public class Child { 
    ... 
    @Lob 
    private byte[] data; 
    ... 
} 

Attualmente sto lavorando intorno a questo orfani eliminando manualmente.

risposta

9

Cascading ha senso solo per entity state transitions che si propagano da un genitoread un Bambino. Nel tuo caso, il genitore era in realtà il figlio di questa associazione (con l'FK).

Prova con questa mappatura invece:

@Entity 
public class Parent { 
    ... 
    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "parent") 
    private Child child; 
    ... 
} 

@Entity 
public class Child { 

    @OneToOne 
    @JoinColumn(name = "parent_id") 
    private Parent parent; 

    ... 
    @Lob 
    private byte[] data; 
    ... 
} 

E a cascata la rimozione orfana, è ora necessario:

Parent parent = ...; 
parent.getChild().setParent(null); 
parent.setChild(null); 
+1

Ho provato questo e si sta lavorando come hai descritto, ma per qualche motivo il mio il caricamento lento ha smesso di funzionare ora. Ho esaminato la query generata e posso vedere due chiamate selezionate che si verificano per ottenere il genitore e l'altro per il figlio e il genitore iscritto. Qualche idea? – ankurvsoni

+0

Due selezioni significa che il LAZY funziona. Puoi unire FETCH usando una query HQL/JPQL. –

+0

Intendo dire quando faccio qualcosa del genere - Parent result = repository.findOne (parent.getId()). Vedo due selezioni. Pensavo solo quando facevo qualcosa del tipo: result.getChild() - vedrei la seconda selezione. Non è un'ipotesi giusta? – ankurvsoni