Perché APP non cancellerà entità di proprietà quando l'entità titolare perde il riferimento a loro?

StackOverflow https://stackoverflow.com/questions/1133179

  •  16-09-2019
  •  | 
  •  

Domanda

Ho un'entità JPA "richiesta", che possiede un elenco di risposte (anche entità JPA). Ecco come viene definito in Request.java:

@OneToMany(cascade= CascadeType.ALL, mappedBy="request")
private List<Answer> answerList;

E in Answer.java:

@JoinColumn(name = "request", referencedColumnName="id")
@ManyToOne(optional = false)
private Request request;

Nel corso di esecuzione del programma, della richiesta Lista delle risposte possono avere risposte aggiunti o rimossi da esso, o l'oggetto vero e proprio elenco può essere sostituito. Il mio problema è dunque: quando mi fondo una richiesta al database, gli oggetti rispondono che usati di essere nella lista sono conservati nel database - che è, risposta oggetti che la richiesta non è più in possesso di una riferimento (indirettamente, tramite una lista) non vengono eliminati.

Questo non è il comportamento che desidero, come se mi fondo una richiesta al database e quindi prenderlo di nuovo, la sua lista risposte non può essere lo stesso. Sto facendo qualche errore di programmazione? C'è un'annotazione o l'impostazione che farà in modo che le risposte nel database sono esattamente le risposte nella lista del Request?

Una soluzione è quella di mantenere i riferimenti a elenco risposte originali e quindi utilizzare l'EntityManager per rimuovere ogni vecchia risposta prima di fondersi la richiesta, ma sembra che ci dovrebbe essere un modo più pulito.

È stato utile?

Soluzione

In JPA 1.0, ciò che si vuole fare non può essere fatto da JPA. Semplicemente, tutta la gestione rapporto deve essere fatta con l'applicazione, tra cui la rimozione di eventuali orfani da collezioni (che è quello che stai cercando di fare).

In JPA 2.0, che fanno il supporto (anche se non conosco i dettagli), ma a seconda dell'implementazione, l'aggiornamento potrebbe non essere facile o possibile.

Si può anche usare qualcosa come Hibernate direttamente, ma ancora utilizzare molte JPA 1.0 annotazioni, ecc non posso fornire dettagli su che sia.

Nel mio caso ho scritto codice generico per gestire la fusione delle collezioni automaticamente attraverso la riflessione.

Altri suggerimenti

Utilizzando EclipseLink e mettendo l'annotazione @PrivateOwned per answerList aiuterebbe.

E 'illegale per specificare proprietà aggiuntive in relazione mappata. È possibile utilizzare l'annotazione @DependentElement a richiesta invece.

Se si utilizza Hibernate come provider JPA, si potrebbe aggiungere un

@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)

sul answerList. Questo potrebbe funzionare in aggiunta alle annotazioni APP non si utilizza già. JPA 2 (la maggior parte / tutti i provider JPA non hanno una produzione pronta attuazione a questo momento) può fare questo da sola.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top