Ruhezustand - bidirektional @OneToOne

8

Ich habe 2 Klassen: User und UserPicture, die eine 1: 1 Beziehung haben.

%Vor%

'Benutzer' in UserPicture wird geladen, aber 'userPicture' im Benutzer nicht - was habe ich falsch gemacht?

BEARBEITEN Muss ich hinzufügen, dass ich nur ein UserPicture erstellen und sie (mit existierender userId) einfügen - vielleicht muss ich "user" in UserPicture kaskadieren?

    
user1731299 24.10.2012, 07:24
quelle

3 Antworten

14

Sie müssen Ihre Klassen zuordnen.

%Vor%     
Pigueiras 24.10.2012, 08:06
quelle
3

In Bezug auf Ihre Frage: (weil ich nicht genug Ruf habe, um in einem Kommentar zu antworten)

"Alles klar! Nur eine Frage mehr, ist es möglich, userPicture in User faul? - user1731299 24. Oktober 12 um 10:44"

Ja, es ist möglich, es faul zu machen. Das Aussprechen von "fetchType = FetchType.Lazy" funktioniert jedoch nicht. Grund dafür ist, dass Hibernate die verbundene Tabelle überprüfen muss, um festzustellen, ob es sich um einen Nullwert handelt oder ob dort ein Datensatz vorhanden ist. Da es sich um ein OneToOne-Mapping handelt, stellt Hibernate fest, dass es einen Datenbankaufruf speichern kann, indem es nur vorhandene Daten zurückzieht, da es prüfen musste, ob es ohnehin null war. Dies ist bei X-zu-Viele-Mappings nicht der Fall, da Hibernate weiß, dass das "Viele" bedeutet, dass eine Liste auf dem anderen Tisch wartet ... sei es eine leere oder eine ausgefüllte Liste, es ist immer noch eine Liste. Für einen einzelnen Wert muss zwischen den tatsächlichen Daten und einem Nullwert unterschieden werden.

Der Weg ist, Hibernate zu sagen, dass dort IMMER ein Wert und NIE ein Nullwert sein wird. Hibernate kann einen Platzhalter erstellen, bis es Zeit ist, diese Daten abzurufen. Die Art, wie Sie dies in Annotationen tun, besteht darin, Ihrer @OneToOne-Annotation "optional = false" hinzuzufügen.

Aber seien Sie gewarnt! Es gibt einige Probleme damit; einschließlich der, die ich jetzt herausfinden möchte (und wie ich dazu gekommen bin, über deine Frage hier zu stolpern). Diese Option = false bewirkt, dass Hibernate eine kleine zusätzliche Überprüfung durchführt und Hibernate dahingehend zu verwirren scheint, wie es Einfügungen ausführen soll. Also, du solltest dich vielleicht von dieser faulen Methode fernhalten.

    
AEvans 06.08.2013 17:56
quelle
1

Lazy-Laden in One-to-One funktioniert auch dann, wenn wir das Feld in der JoinColumn-Annotation als nicht nullbar angeben. In einem bidirektionalen One-to-One funktioniert das Lazy Loading jedoch nicht in der Entity, in der wir mappedBy = '' verwenden. Zum Beispiel, wenn wir zwei Entitäten Contract und House haben, wobei die Contract-Tabelle einen Fremdschlüssel für House enthält. Wenn wir bidirektionale OneToOne hier verwenden und versuchen, einen Vertrag zu laden, funktioniert Lazy Loading (d. H. Haus wird nicht eifrig geladen), aber wenn wir versuchen, House zu laden (unter Verwendung von House-Repository), wird der Vertrag immer eifrig abgerufen. Hat jemand eine Idee, warum das passiert?

%Vor%

Ich weiß, das ist nur eine Teilantwort, eine Frage. Aber es ist sehr auf die Diskussion hier bezogen.

    
Vaibhav Bansal 25.07.2016 23:28
quelle

Tags und Links