Przeczytałem, że getOne()
jest leniwy załadowany i findOne()
pobiera od razu cały obiekt. Sprawdziłem dziennik debugowania i nawet włączyłem monitorowanie na moim serwerze sql, aby zobaczyć, które instrukcje zostały wykonane. Stwierdziłem, że zarówno getOne()
, jak i findOne()
generują i wykonują to samo zapytanie. Jednak gdy używam getOne()
, wartości są początkowo zerowe (z wyjątkiem oczywiście ID).Różnica między CrudRepository findOne() i JpaRepository getOne()
Czy ktoś mógłby mi powiedzieć, że jeśli obie metody wykonują to samo zapytanie w bazie danych, to dlaczego powinienem używać jednego na drugim? Zasadniczo szukam sposobu na pobranie obiektu bez uzyskiwania wszystkich jego elementów podrzędnych/atrybutów.
Edit1:
kod Tao:
@Repository
public interface FlightDao extends JpaRepository<Flight, Long> {
}
Debugging log findOne() vs getOne()
EDIT2:
Dzięki Chlebik udało mi się zidentyfikować problem. Jak powiedział Chlebik, jeśli spróbujesz uzyskać dostęp do jakiejkolwiek własności jednostki pobieranej przez getOne()
, pełne zapytanie zostanie wykonane. W moim przypadku sprawdzałem zachowanie podczas debugowania, przesuwając jedną linię naraz, zupełnie zapomniałem, że podczas debugowania IDE próbuje uzyskać dostęp do właściwości obiektu w celu debugowania (lub przynajmniej tak to właśnie się dzieje), więc debugowanie wyzwala pełne wykonanie zapytania. Przestałem debugować, a następnie sprawdziłem logi i wszystko wyglądało normalnie.
getOne()
vs findOne()
(Ten dziennik jest pobierana z MySQL general_log
i nie hibernacji.
Dzięki za informacje. Właściwie to, co robi 'getOne()', nazywa się 'getReference()'. Jestem bardzo zdezorientowany, ponieważ jak już wcześniej wspomniałem obie metody wygenerowały i wykonały to samo zapytanie! Więc może ma to związek z MySQL? Naprawdę chcę, żeby ktoś mógł to potwierdzić. Czy masz jakieś pojęcie, czy zapytanie powinno różnić się między dwiema metodami w normalnym scenariuszu? – prettyvoid
Dostawca nie oznacza np. MySQL, ale Hibernate/TopLink/cokolwiek używasz. Zakładam, że realizowana kwerenda opiera się na zdefiniowanych relacjach w Twoich podmiotach i prawdopodobnie optymalizacji wykonanej przez implementację JPA. IMHO z prostą jednostką nie ma dużej różnicy między pobieraniem handler'a do encji (jak z ** getReference **) i rzeczywistym pobieraniem wszystkich danych. – Chlebik
Muszę uzyskać odwołanie, ponieważ podmioty, które próbuję pobrać, mają wiele pod-encji, to dużo pracy, aby pobrać całość, gdy potrzebuję tylko identyfikatora jednostki. Poczekaj chwilę, może ktoś może nam powiedzieć, co się dzieje. Jeszcze raz dziękuję – prettyvoid