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