To jest pytanie projektowe, konkretny kod nie został przesłany, aby chronić moje dno.org.hibernate.Session.clear() za szkodliwe?
Podczas pracy z Hibernate średnia przepływu pracy jest następujący:
- otwartą sesję
- Rozpoczęcie transakcji
- wykonaj gospodarczej (czytać i modyfikować dane)
- dokonać transakcji
- sesja
z możliwym iteracje przez 2-4.
Jakie są rozsądne przypadki użycia dla Session.clear()?
A: Konkretny problem, jaki mam, to (duży) fragment kodu, który ładuje i modyfikuje obiekty, a następnie wyczyści sesję, zasadniczo usuwając wprowadzone zmiany. (Zadanie biznesowe do wykonania nie obejmuje modyfikacji jednostek, więc kod "działa").
Wydaje mi się, że właściwym projektem byłoby upewnienie się, że (duży) fragment kodu nie wprowadza zmian, których nie chce zapisać?
B: Sądzę, że Session.clear() istnieje dla wygody/elastyczności, nie dlatego, że warto go używać.
Czy źle zrozumiałem filozofię Hibernacji?
C: Podżeganie: Czy jest to zły pomysł na to, aby kod struktury bezwarunkowo czyścił() sesję po zakończeniu zadania? IMHO, framework powinien narzekać, jeśli sesja jest brudna po zakończeniu zadania! Sesja powinna zostać zamknięta, ponieważ zadanie zostało wykonane ... (Nie licząc wydajności minutowej)
(Etykiety A, B i C, aby można było wskazać, na którą część odpowiadasz).
ad A): przetwarzanie dużych zbiorów danych w ramach jednej transakcji brzmi jak zły projektowania do mnie (przyznane, nie może mieć myśli o wszystkich możliwych problemów ...). Co rozumiesz przez "jawne" utrzymywanie istoty? session.save (entity)? Reklama C): Wygląda na to, że zgadzamy się, że ramy nie powinny tego robić - struktura nie może być pewna, co robią klienci. :-) –
@MortenLauritsenKhodabocus: oczywiście ładowanie i modyfikowanie tysięcy rekordów w jednej transakcji hibernacji jest znakiem, że należy użyć innego narzędzia. Tak, przez * jawnie * mam na myśli wywołanie 'save()', a nie pozwolić Hibernate'owi odkryć brudne byty. –
@MortenLauritsenKhodabocus Proszę oświecić mnie. Dlaczego przetwarzanie dużego zestawu danych tylko do odczytu w jednej transakcji byłoby złym pomysłem? Wydaje mi się, że gdyby dotyczył zamawiania po stronie DB, byłby sprytny, ponieważ zaoszczędziłby na potrzebie wielokrotnej reorganizacji. Czy użycie transakcji nie oznacza, że DB zapamięta Twój uporządkowany stan przez różne zapytania, które są częścią tej samej transakcji? Co więcej, czy funkcja "ScrollableResults API Hibernate" nie używa "jednej Transakcji"? – KyleM