Aplikacja, nad którą pracuję, używa Hibernate wyłącznie do pobrania paczki trwałych obiektów z bazy danych do pamięci. Aplikacja odświeża tę migawkę w pamięci z bazy danych co jakiś czas i powinna to być jedyna komunikacja z bazą danych.Jak mogę załadować zestaw odwzorowany w hibernacji jako zestaw niemodyfikowalny?
Obiekty znajdujące się w pamięci są następnie wykorzystywane do szeregu obliczeń. Obliczenia nie mogą modyfikować tych obiektów. Z wyjątkiem pewnej klasy gdzieś przypadkowo, i musiałem spędzić dzień na polowaniu na pluskwę. Teraz zastanawiam się, jaki jest najlepszy sposób, aby uczynić całe drzewo obiektów niezmiennym.
Załóżmy hierarchia klasy wygląda następująco:
public class Building { // persistent entity
private String name; // hibernate-mapped property
private Set<Person> inhabitants; // hibernate-mapped collection
// getters
}
public class Person { // persistent entity
private String name; // hibernate-mapped property
// getters
}
mam uniemożliwił klientom dostępu do bazy danych przez:
- chętnie ściągam wszystkie podmioty i kolekcje
- znakowania wszystkie podmioty i kolekcje z
mutable=false
w odwzorowaniach hibernacji - nie dostarczanie żadnych wystąpień sesji Hibernate lub stanu-changin Metody g dao.
Teraz błąd, który chciałbym zapobiec, to ktoś, kto przypadkowo przejdzie building.getInhabitants().clear();
. Mogę myśleć o tych opcji:
Getter owijania: Marka
getInhabitants
pierwszy okładinhabitants
wCollections.unmodifiableSet()
rozmowy, a następnie zwrócić go.- Plusy: Najmniej praca, przynajmniej dodatkowy kod
- Wady: Temp hacky
klas Wrapper: Zmiana nazwy
Building
doMutableBuilding
,Person
doMutablePerson
i zapewniają niezmienne klasBuilding
iPerson
. Ponieważ moja aplikacja ma wyraźny punkt migawki, mogę pobrać rekordy jako zmienne obiekty (tak jak teraz), wykonać głęboko niezmienione kopie i przedstawić to drzewo obiektów klientom.- Zalety: Prosta java, bez magii hibernacji. Używam mojego ulubionego słowa kluczowego:
final
- Wady: Więcej kodu do napisania i obsługi. Ponadto, czy Hibernate zachowa zmienne instancje w pamięci?
- Zalety: Prosta java, bez magii hibernacji. Używam mojego ulubionego słowa kluczowego:
hibernacji mapowanie magia: Użyj że jedno magiczne słowo kluczowe aby poinstruować Hibernate zawinąć zbiory to ustawia na moim obiektów podmiotu w
Collections.unmodifiableSet()
lub równoważne.(Uwaga: używam pliku mapowania xml)- Plusy: Eleganckie, żaden dodatkowy kod
- Wady: Takie słowa kluczowe mogą nie istnieć
Hibernate przedłużenie: Użyj że jednym rozszerzeniem hibernacji skieruj swój własny obiekt instancji, a następnie zawiń zestaw w
Collections.unmodifiableSet()
przed zwróceniem go.- Plusy: Bardziej elegancki niż hacking moich pobierające
- Wady: Taki punkt rozszerzenie nie może istnieć
Teraz jestem pochylony ku # 2, głównie dlatego, że nie wiedzieć, czy 3 i 4 są możliwe.
Jaki jest najlepszy sposób?
+1 za przypomnienie mi, dlaczego piszemy programy pobierające i ustawiające :-) – KarlP
To wydaje się być najlepszym rozwiązaniem. Będę musiał pogodzić się z tym, że zmienne klasy są czasami w porządku! :) – oksayt