Hibernate - bidirektional @OneToOne
Ich habe 2 Klassen: Benutzer-und UserPicture, die eine 1:1-Beziehung.
public class User {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="id", nullable = false, unique = true)
private int id;
private String firstname;
private String lastname;
@OneToOne
@JoinColumn(name = "picture") //field named "picture" in the database
private UserPicture userPicture;
..
}
public class UserPicture {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="id", nullable = false, unique = true)
private int id;
private Blob image;
@OneToOne
@JoinColumn(name = "user")
User user;
'Benutzer' UserPicture wird geladen, aber 'userPicture' im Benutzer-nicht - was hast Im falschen?
BEARBEITEN
Muss hinzufügen, dass ich einfach ein UserPicture und legen Sie Sie (mit vorhandenen userId) - vielleicht muss ich cascade 'Benutzer' UserPicture?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie anzeigen Ihren Klassen.
User
mit einemUserPicture
ist die Erstellung einerUserPicture
rufensetUser
auf das Objekt und speichern Sie es auf der DB.picture
nicht in dieser Konfiguration. Sie haben nur eine Referenzuser
imUserPicture
Tabelle. Wenn Sie wiederherstellen ein Benutzer aus der DB, hibernate lädtUserPicture
Attribut für Sie, weil die Beziehung OneToOne. Ich hoffe, es ist jetzt klar 🙂In Bezug auf Ihre Frage: (weil ich nicht genug Ruf zu reagieren, in einem Kommentar)
"Alles klar! Nur eine Frage, ist es möglich, userPicture im Benutzer-faul? – user1731299 Okt 24 '12 at 10:44"
Ja, es -ist - möglich zu machen, faul zu Holen. Aber einfach nur sagen "fetchType=FetchType.Faul" wird nicht funktionieren. Grund dafür ist, Überwintern muss, überprüfen Sie die verknüpfte Tabelle, um zu sehen, wenn es einen null-Wert, oder wenn es einen Datensatz gibt. Da es sich um eine OneToOne-mapping, Hibernate zahlen, die Sie sparen können eine Datenbank-Aufruf durch ziehen wieder alle Daten da, da war es zu überprüfen, ob es null war sowieso. Dies ist nicht der Fall für x-zu-viele-Zuordnungen, da Hibernate weiß, dass 'viele' bedeutet, es gibt eine Liste mit warten auf den anderen Tisch... sei es eine leere oder eine besiedelte Liste, es ist immer noch eine Liste. Für einen einzelnen Wert, er ist zu unterscheiden zwischen den eigentlichen Daten und einen null-Wert.
Den Weg, um dieses ist zu sagen, Hibernate, es gibt IMMER einen Wert da, und NIE einen null-Wert. Dies zu wissen, Hibernate erstellen kann ein Platzhalter, bis es Zeit zum abrufen die Daten. Die Art und Weise Sie dies tun, in Anmerkungen hinzufügen "optional=false" in der @OneToOne annotation.
Jedoch gewarnt werden! Es gibt einige Probleme mit diesem; darunter auch die, die ich versuche, herauszufinden, nun, und so kam ich zu stolpern über Ihre Frage hier). Diese optional=false macht Hibernate tun, ein wenig zusätzliche Validierung und scheint zu verwirren, Hibernate, wie es ausgeführt werden soll fügt. Also, möchten Sie vielleicht zu bleiben Weg von diesem lazy-fetching-Technik.
Lazy loading in eins-zu-Eins funktioniert auch dann, wenn wir angeben, das Feld als nicht-nullwertfähige in die JoinColumn-annotation. Allerdings in eine bidirektionale eins-zu-Eins lazy loading funktioniert nicht auf der Stelle wir verwenden, mappedBy=". Für zB, wenn wir in zwei Entitäten Vertrag und das Haus, in Vertrags-Tabelle enthält einen Fremdschlüssel zu Haus. Wenn wir Sie benutzen bidirektionale OneToOne hier und versuchen zu laden-Vertrag dann lazy loading funktioniert(d.h. Haus nicht geladen wird eifrig) aber wenn wir versuchen zu laden, Haus (mit Haus-repository), dann ist der Vertrag immer geholt eifrig. Hat jemand eine Idee warum dies passiert?
Ich weiß, das ist nur eine teilantwort, Sperma Frage. Aber es ist sehr viel im Zusammenhang mit der Diskussion hier.