2010-02-25 10 views
5

Mam obiekt hibernacji o nazwie Execution. Jest tworzony na początku mojego procesu i aktualizowany na końcu, wskazując, jak to się skończyło.Aktualizowanie obiektu JPA-Hibernate bez wybierania go z bazy danych

Chciałbym zaktualizować pojedynczą właściwość tego obiektu, bez powodowania wyboru w mojej bazie danych.

Execution execution = entityManager.getReference(Execution.class, executionId); execution.setStatus(Status.FINISHED); // -> Wywołanie tej metody uruchamia SELECT w mojej bazie danych. Nie chciałem, żeby to się stało, chcę tylko zaktualizować mój podmiot.

Nie jest to specyficzne dla tej metody, każda inna wywołana metoda daje w wyniku klauzulę SELECT. W rzeczywistości wybór wydaje się mieć miejsce jeszcze przed wywołaniem mojej metody. Mam wrażenie, że proxy hibernacji umieszcza jakiś kod wewnątrz klasy contructor no-args, by uruchamiać select za każdym razem, gdy wywoływana jest jakakolwiek metoda.

Czy można aktualizować obiekty JPA/hibernacji bez uruchamiania instrukcji SELECT w mojej bazie danych?

Odpowiedz

1

W ten sposób działa Hibernate. Obiekt proxy ładuje rzeczywisty obiekt z bazy danych wszędzie tam, gdzie uzyskuje się dostęp do właściwości innych niż id.

Spróbuj zapisać/załadować obiekt na początku procesu (aby wykonać to SELECT) i upewnij się, że sesja nie jest automatycznie czyszczona po każdym dotknięciu obiektu (domyślne zachowanie to brak automatycznego płukania) , ale warto sprawdzić).

Można również spróbować odłączyć obiekt od sesji hibernacji podczas przetwarzania.

+1

Przyjmuję tę odpowiedź jako właściwą. Natrafiłem na łatwiejsze rozwiązanie tego, czego chcę, używając JPA-QL Bulk Update/Insert http://docs.jboss.org/hibernate/stable/entitymanager/reference/en/html/batch.html#batch-direct – user266391

+0

@ user266391 Nie znam JPA, dzięki za link :-) –