2016-03-16 13 views
5

Ich habe die folgenden zwei Tabellen in meiner Datenbank:Hibernate: Einfügen von Daten mit Fremdschlüssel

Kalender (id, name, user_id)

Benutzer (ID, Name, ...)

Jeder Kalender gehört einem Benutzer, jeder Benutzer kann mehrere Kalender haben. Daher gibt es eine Viele-zu-Eins-Beziehung von Kalender zu Benutzer. Nun würde Ich mag eine Reihe von Daten in meinen Kalender-Tabelle einzufügen, sieht mein Kalender Entity wie folgt aus:

@Entity 
@Table(name = "calendar") 
public class Calendar { 

    @Id 
    @GeneratedValue(generator = "uuid2") 
    @GenericGenerator(name = "uuid2", strategy = "uuid2") 
    @Column(name = "id", columnDefinition = "BINARY(16)") 
    private UUID id; 

    @Column(name = "name") 
    private String name; 

    @ManyToOne 
    @JoinColumn(name = "owner", referencedColumnName = "id") 
    private User owner; 
    ... 
} 

Allerdings, wenn ich den Datensatz bin Einfügen, ich weiß, die ID des Besitzers, aber ich don habe das entsprechende User Objekt nicht. Muss ich das Objekt User abrufen, owner darauf setzen und dann den Datensatz einfügen?

Das klingt ein wenig unbequem für mich, gibt es eine Möglichkeit, den Datensatz mit der User ID einfügen, wie es in der Datenbank gespeichert wäre, im Gegensatz zu einem User Objekt verwenden?

+0

Mögliche Duplikat [Hibernate - wie mit abgesetzter Kind zu retten parent] (http: // Stackoverflow .com/questions/32130703/hibernate-wie-zu-speichern-parent-with-detached-child) –

Antwort

1

können Sie Benutzer Proxy-Instanz mit der angegebenen Besitzer-ID (es ist billig Betrieb). Dann nutzen Sie diese Instanz als Eigentümer Wert:

User dummy = hibernateTemplate.load(User.class, ID); //entityManager.getReference or session.load should do the trick too 
calendar.setOwner(dummy); 
hibernateTemplate.save(calendar) 
+0

Das Problem mit diesem Ansatz ist, dass Hibernate das Benutzerobjekt auch aktualisiert, so dass alle seine Daten abgesehen von der ID zurückgesetzt werden. Gibt es eine Möglichkeit, dieses Verhalten zu deaktivieren? – user2035039

+0

eine Antwort behoben, versuchen Sie es :) – Cootri

+1

Ich habe versucht, das zu vermeiden, aber ich denke, es gibt keinen anderen Weg – user2035039

0

ein neues User Einfach in Ihr Calendar:

Calendar c = new Calendar(); 
c.setOwner(new User(id)); 
Verwandte Themen