2011-06-25 8 views
5

mam następujący scenariusz (w Java/hibernacji):Jak zapobiegać niepotrzebnemu wybraniu przy wstawianiu?

  • że dwie klasy podmiot X i Y. X ma związek @ManyToOne do Y, które nie są kaskadowo.
  • Tworzę (niezarządzaną) instancję x z X i (niezarządzaną) instancję y z Y i wypełniam odwołanie do y wx. Jedynym polem y, które jest wypełnione, jest klucz podstawowy.
  • Jednostka y ma już odpowiedni wiersz w podstawowej bazie danych, ale jednostka x jest nowa.
  • Utrzymuję encję x.

Kiedy wykonuję ten scenariusz, spodziewam się zobaczyć jedno zapytanie: INSERT x. Jednak to, co naprawdę się dzieje, że Hibernate wykonuje dwa zapytania:

  • SELECT y
  • INSERT x

Ponadto, ja również zauważyć, że po utrzymują x odniesienie do Y w rzeczywistości nie zostać zarządzonym i nie ma żadnej instancji Y w sesji! Dlaczego w ogóle jest SELECT na y? Czy istnieją sposoby, aby temu zapobiec?

Odpowiedz

2

Nie musisz (właściwie nie powinieneś) tworzyć instancji Y ręcznie. Można zrobić wariant to (w zależności od konfiguracji)

Y y = (Y) session.load(Y.class, pk); 

nie odzyskać Y z bazy danych, a nie ładuje proxy składają tylko z pk pan wspomniał.

Następnie przypisanie y do x, i utrzymanie x będzie zachowywać się zgodnie z oczekiwaniami.

+0

Ładne, działa jak czar! Wszelkie pomysły na drugą część mojego pytania: w moim scenariuszu, dlaczego Hibernate wykonuje SELECT na y? – Rubrick

+0

Myślałem o tym, ale nie miałem pewnej odpowiedzi. Domyślam się, że ręcznie tworzysz instancję, jest ona obiektem odłączonym (nie jest zarządzanym przez kontekst utrwalania hibernacji), więc Hibernate musi sprawdzić, czy rzeczywiście istnieje w bazie danych. Ale nie jestem tego pewien, ponieważ nawet gdyby nie istniało, db zwróciłby błąd ograniczenia obcości, a wstawka by się nie powiodła. W skrócie, nie wiem :) – SelimOber

Powiązane problemy