Po pierwsze, kilka wyjaśnień do odpowiedzi KLE :
Nieograniczone (zerowalne) skojarzenie jeden do jednego jest jedynym, które nie może być proxy bez oprzyrządowania z kodem bajtowym. Powodem tego jest to, że jednostka właściciela MUSI wiedzieć, czy właściwość asocjacji powinna zawierać obiekt proxy, czy NULL, i nie może tego ustalić, patrząc na kolumny swojej tabeli podstawowej ze względu na normalne odwzorowanie jeden do jednego za pośrednictwem współdzielonego PK, więc i tak musi być chętnie pobierany, przez co proxy nie ma sensu. Oto bardziej szczegółowe wyjaśnienie.
stowarzyszenia wiele do jednego (i oczywiście jeden do wielu) nie cierpią z powodu tego problemu. Podmiot będący właścicielem może łatwo sprawdzić swój FK (aw przypadku „jeden do wielu” początkowo tworzony jest pusty serwer proxy kolekcji i zapełniany na żądanie), więc powiązanie może być leniwe.
Zamiana jeden na jeden na jeden na wielu nigdy nie jest dobrym pomysłem. Możesz go zastąpić unikatowym rozwiązaniem wiele do jednego, ale istnieją inne (być może lepsze) opcje.
Rob H. ma rację, ale możesz nie być w stanie go wdrożyć w zależności od modelu (np. Jeśli twoje powiązanie jeden do jednego jest zerowane).
Jeśli chodzi o oryginalne pytanie:
A) @ManyToOne(fetch=FetchType.LAZY)
powinien działać dobrze. Czy na pewno nie jest zastępowane w samym zapytaniu? Możliwe jest określenie join fetch
w HQL i / lub jawne ustawienie trybu pobierania poprzez Criteria API, który miałby pierwszeństwo przed adnotacjami klas. Jeśli tak nie jest i nadal masz problemy, opublikuj swoje klasy, zapytanie i wynikowy SQL, aby uzyskać bardziej szczegółową rozmowę.
B) @OneToOne
jest trudniejsze. Jeśli zdecydowanie nie ma wartości zerowej, skorzystaj z sugestii Roba H. i określ ją jako taką:
@OneToOne(optional = false, fetch = FetchType.LAZY)
W przeciwnym razie, jeśli możesz zmienić bazę danych (dodaj kolumnę klucza obcego do tabeli właściciela), zrób to i zamapuj ją jako „połączoną”:
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name="other_entity_fk")
public OtherEntity getOther()
oraz w OtherEntity:
@OneToOne(mappedBy = "other")
public OwnerEntity getOwner()
Jeśli nie możesz tego zrobić (i nie możesz żyć z chętnym pobieraniem) instrumentacja z kodem bajtowym jest twoją jedyną opcją. Muszę jednak zgodzić się z CPerkins - jeśli masz 80 !!! dołącza z powodu chętnych skojarzeń OneToOne, masz większe problemy niż to :-)
one-to-one
z formułą podobną doselect other_entity.id from other_entity where id = other_entity.id
. Oczywiście nie jest to idealne rozwiązanie do wykonywania zapytań.