Zunächst einige Klarstellungen zu KLEs Antwort:
Die uneingeschränkte (nullfähige) Eins-zu-Eins-Zuordnung ist die einzige, die ohne Bytecode-Instrumentierung nicht als Proxy verwendet werden kann. Der Grund dafür ist, dass die Eigentümerentität wissen MUSS, ob die Zuordnungseigenschaft ein Proxy-Objekt oder NULL enthalten soll, und dies nicht durch Betrachten der Spalten der Basistabelle feststellen kann, da die Eins-zu-Eins-Zuordnung normalerweise über eine gemeinsam genutzte PK erfolgt muss sowieso eifrig geholt werden, was Proxy sinnlos macht. Hier ist eine detailliertere Erklärung.
Viele-zu-Eins-Assoziationen (und natürlich Eins-zu-Viele) leiden nicht unter diesem Problem. Die Eigentümerentität kann problemlos ihre eigene FK überprüfen (und im Fall von Eins-zu-Viele wird zunächst ein leerer Sammlungsproxy erstellt und bei Bedarf ausgefüllt), sodass die Zuordnung faul sein kann.
Eins-zu-eins durch eins-zu-viele zu ersetzen, ist so gut wie nie eine gute Idee. Sie können es durch eindeutige Viele-zu-Eins-Optionen ersetzen, es gibt jedoch auch andere (möglicherweise bessere) Optionen.
Rob H. hat einen wichtigen Punkt, aber Sie können nicht in der Lage sein , es zu implementieren je nach Modell (zB wenn Sie eine Eins-zu-Eins - Zuordnung ist nullable).
Nun zur ursprünglichen Frage:
A) @ManyToOne(fetch=FetchType.LAZY)
sollte gut funktionieren. Sind Sie sicher, dass es in der Abfrage selbst nicht überschrieben wird? Es ist möglich, join fetch
in HQL anzugeben und / oder den Abrufmodus explizit über die Kriterien-API festzulegen, die Vorrang vor Klassenanmerkungen hat. Wenn dies nicht der Fall ist und Sie immer noch Probleme haben, veröffentlichen Sie bitte Ihre Klassen, Abfragen und das daraus resultierende SQL, um eine genauere Konversation zu erhalten.
B) @OneToOne
ist schwieriger. Wenn es definitiv nicht nullbar ist, folgen Sie dem Vorschlag von Rob H. und geben Sie ihn als solchen an:
@OneToOne(optional = false, fetch = FetchType.LAZY)
Wenn Sie andernfalls Ihre Datenbank ändern können (fügen Sie der Besitzertabelle eine Fremdschlüsselspalte hinzu), tun Sie dies und ordnen Sie sie als "verbunden" zu:
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name="other_entity_fk")
public OtherEntity getOther()
und in OtherEntity:
@OneToOne(mappedBy = "other")
public OwnerEntity getOwner()
Wenn Sie das nicht können (und nicht mit eifrigem Abrufen leben können), ist die Bytecode-Instrumentierung Ihre einzige Option. Ich muss CPerkins jedoch zustimmen - wenn Sie 80 haben !!! tritt aufgrund eifriger OneToOne-Assoziationen bei, Sie haben größere Probleme als diese :-)
one-to-one
mit einer Formel wieselect other_entity.id from other_entity where id = other_entity.id
. Dies ist natürlich nicht ideal für Abfrageleistungen.