Utworzyłem Obiekt A {id: long (AutIncrement), name: String}, który zapiszęOrupdate z hibernacją.
Chcę wiedzieć przed uratowaniem A, co będziebyć wygenerowanym Id. Potrzebuję tego, ponieważ muszę ustawić właściwości w A, które zależą od właściwości obiektu B, ale mam również właściwości w B w zależności od obiektu A.
To rodzaj kołowej zależności. Podczas wypełniania B potrzebuję identyfikatora A, podczas wypełniania A potrzebuję jednej wygenerowanej właściwości B.
Czy istnieje sposób, aby wiedzieć przed zapisaniem A, który będzie miał jego identyfikator.
Z góry dziękuję rgd
Odpowiedzi:
0 dla odpowiedzi № 1Jak stwierdził kdgregory, ogólna odpowiedź jest taka, że nie jest to możliwe. Ten rodzaj zależności cyklicznej jest generalnie oznaką problemu związanego z projektowaniem struktury bazy danych.
Biorąc to pod uwagę, jeśli naprawdę chcesz to zrobić, możesz ręcznie zadeklaruj sekwencję w bazie danych, powiedz hibernacji, że strategia generowania klucza podstawowego to assigned
(wystarczy nie dołączać żadnego generatora). Następnie w swojej aplikacji, podczas tworzenia nowego A, najpierw uzyskujesz jego identyfikator z sekwencji, umieszczasz go w sprzeciwie, robisz to, czego potrzebujesz z obiektami zależnymi od niego, a na koniec go utrwalasz.
Ale strzec się, jako czas utrzymywania się B, identyfikator A będzie znany, ale oczywiście żaden A nie będzie obecny w bazie danych.
0 dla odpowiedzi nr 2
Nie będziesz mieć dostępu do identyfikatora, dopóki nieczas spłukiwania, Możesz dodać kaskadową wstawkę / aktualizację do relacji, ale może to doprowadzić cię do piekła, szczególnie gdy masz zależność cykliczną. Zrobiłbym to, co powiedział @kdgregory, zmień strukturę tabeli.