Was ist die geeignete Methode zum Erstellen eines untergeordneten Objekts eines persistenten Superobjekts mit Hibernate?So erstellen Sie ein untergeordnetes Objekt eines vorhandenen Superobjekts mithilfe der Vererbung von JOINED und Hibernate
Betrachten Sie folgendes Beispiel: In der Datenbank ist persistent User
mit ID 1, firstName Kevin und laseName Smith. Zu der Zeit ist das Datenbankmodell der neuen Entität Auditor
erweitert, die eine Kindklasse von User
ist. Für die Vererbung wird die Strategie JOINED
verwendet, sodass das Datenbankmodell jetzt über Tow-Tabellen verfügt: Benutzer und Auditor. Diese Tabellen sind mit user_id FK verbunden.
Ich möchte von Kevin Smith Objekttyp Auditor erstellen und persistieren. Problem ist, dass Operationen transaktional und Hibernate-Würfe NonUniqueObjectException
sind. Gibt es einen Weg, wie ein persistentes Objekt sicher untergeordnet werden kann? Ich habe versucht, gegebenes Benutzerobjekt zu vertreiben, aber immer noch dasselbe.
Benutzer Einheit
@Entity
@Table(name = "user")
@Inheritance(strategy = InheritanceType.JOINED)
public class User{
private Long id;
private String firstName;
private String lastName;
// getters and setters
}
Auditor Einheit
@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); // ... }
Ich hoffe, das Problem ist klar, wenn nicht, werde ich versuchen, die Beschreibung zu verbessern.
hinzufügen Code tun können als du die Ausnahme bekommen hast. 'NonUniqueObjectException' bedeutet, dass eine einzelne Sitzung mehrere Objekte desselben Typs in der Sitzung mit demselben Bezeichner enthält. – Chaitanya
@ Chaitanya tat ich. –
Versuchen Sie, session.merge() aufzurufen, bevor Sie evict() aufrufen. – Jack