Come faccio a specificare la dipendenza a JPA senza collegamenti da un'entità proprietario?
-
21-09-2019 - |
Domanda
L'obiettivo è quello di rimuovere tutti i dipendenti quando il loro proprietario viene eliminato. Ho le seguenti classi:
@Entity
class Dependent {
@ManyToOne(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY, optional = false)
@Column(name = "OWNER")
private Owner _owner;
}
@Entity
class Owner {
...
}
Nell'implementazione corrente Dipendente esistono ancora dopo il suo proprietario è stato cancellato.
Il proprietario non ha nessun link a dipendenti e non può essere modificata, quindi non posso usare @Dependent annotazione o cascade = CANC.
sono supportati da JPA tale "dipendenza inversa"? Un'altra questione è quello che fa opzionale = garanzia "falsa", mentre il _owner campo viene cancellato?
Soluzione
Sono disponibili due opzioni: È necessario aggiungere una sacchetto / set / list per la Owner
classe con cascade-delete
. È possibile effettuare questa lazy bag e mai accedervi, in modo da non avere un impatto sulle prestazioni fino a quando si elimina.
L'altra opzione è quella di eliminare le istanze Dependent
con una query quando si elimina il proprietario. Dal momento che JPA non fa garbage collection automatica dei casi, è necessario avviare il elimina manualmente in ogni caso, quindi basta assicurarsi che ogni utilizza una singola funzione per eliminare i proprietari e quindi aggiungere la chiamata per eliminare i bambini lì.
Altri suggerimenti
Un modo per risolvere questo problema è utilizzare una sottoclasse che condividono le stesse tabelle come proprietario di e aggiungere una collezione che punta al dipendente. Io non sono d'accordo con il punto di Aaron Digulla su 'opzionale = false', questa affermazione solo mostra l'Assocation è opzionale, e perché non ha avuto l'assocation bidrectional, in modo che il dipendente di gestire sempre la mappatura.