qual è il modo appropriato come creare oggetto figlio di oggetto super persistente con Hibernate?Come creare un oggetto figlio di un superoggetto esistente, utilizzando la strategia di ereditarietà JOINED e Hibernate
Considerare l'esempio seguente: Nel database è persistente User
con ID 1, firstName Kevin e laseName Smith. Al momento è stato esteso il modello di database della nuova entità Auditor
, che è la classe figlio di User
. Per l'ereditarietà viene utilizzata la strategia JOINED
, quindi il modello di database ora dispone di tabelle di rimorchio: utente e auditor. Queste tabelle sono collegate usando user_id FK.
Vorrei creare un oggetto di tipo revisore di Kevin Smith e persistere. Il problema è che le operazioni sono transazionali e Hibernate genera NonUniqueObjectException
. Esiste in qualsiasi modo come castare in modo sicuro l'oggetto persistente fare oggetto figlio? Ho provato a sfrattare dato oggetto utente, ma sempre lo stesso.
entità User
@Entity
@Table(name = "user")
@Inheritance(strategy = InheritanceType.JOINED)
public class User{
private Long id;
private String firstName;
private String lastName;
// getters and setters
}
entità Sindaco
@Entity
@Table(name = "auditor")
public class Auditor extends User {
// some properties
}
Logic
public void createAuditorOfUser(final long userId) { final User user = userService.getUserById(userId); // ... final Auditor auditor = new Auditor(); auditor.setId(user.getId()); auditor.setFirstName(user.getFirstName()); auditor.setLastName(user.getLastName()); userService.evict(user); // will throw NonUniqueObjectException auditorService.update(auditor); // ... }
Spero che il problema sia chiaro, altrimenti cercherò di migliorare la descrizione.
Aggiungere codice quando hai ottenuto l'eccezione. 'NonUniqueObjectException' significa che una singola sessione ha più oggetti dello stesso tipo in sessione con lo stesso identificatore. – Chaitanya
@Chaitanya l'ho fatto. –
Prova a chiamare session.merge() prima di chiamare evict(). – Jack