La domanda è fondamentalmente lo stesso come di seguito uno:Primavera-dati JPA: salvare nuova entità riferimento a quello esistente
JPA cascade persist and references to detached entities throws PersistentObjectException. Why?
Sto creando una nuova entità che fa riferimento a uno esistente, uno indipendente. Ora, quando salvo questa entità nel mio repository di dati molla viene generata un'eccezione:
org.springframework.dao.InvalidDataAccessApiUsageException: detached entity passed to persist
se guardiamo il metodo save() nel codice sorgente di JPA dati di primavera vediamo:
public <S extends T> S save(S entity) {
if (entityInformation.isNew(entity)) {
em.persist(entity);
return entity;
} else {
return em.merge(entity);
}
}
e se guardiamo isNew() in AbstractEntityInformation
public boolean isNew(T entity) {
return getId(entity) == null;
}
Quindi, in pratica, se i save() una nuova entità (id == null)
, dati di primavera saranno sempre chiamare persistere e, quindi, questo scenario alw ays fallire.
Questo sembra essere un caso di utilizzo molto tipico quando si aggiungono nuovi elementi alle raccolte.
Come posso risolvere questo?
EDIT 1:
NOTA:
Questo problema non è direttamente correlata alla How to save a new entity that refers existing entity in Spring JPA?. Per elaborare supponiamo di ottenere la richiesta di creare la nuova entità su http. Quindi estrarre le informazioni dalla richiesta e creare la propria entità e quella esistente di riferimento. Quindi saranno sempre distaccati.
Bloccato con lo stesso scenario ... qualche soluzione? – raksja
No, non proprio ... Ovviamente è possibile gestire le eccezioni e quindi prima creare (persistere) il nuovo oggetto e aggiungere il riferimento dopo aver mantenuto il nuovo. Ma ciò non funziona in tutti i casi ... –
Un'altra opzione è determinare se siamo in questa situazione: 'entity.getId() == null && entity.getReferencedEntity(). GetId()! = Null' e se true carica l'entità referenziata dal database. –