2013-01-03 6 views
6

Zajmuję się tworzeniem prostych aplikacji internetowych, które eksponują model domeny jako zasoby RESTful. Mam zamiar używać JPA2 (Hibernate) z obsługą SpringMVC REST.Czy istnieje sposób na ujawnienie elementów hibernacji jako zasobów RESTful bez DTO?

Podczas przekierowywania obiektów Hibernuj do XML/JSON, jeśli obiekt jest odłączony, zostanie wygenerowany wyjątek LazyLoadingException dla leniwych skojarzeń potomnych. Jeśli obiekt jest nadal przyłączony do sesji Hibernate, prawie załaduje całą bazę danych.

Próbowałem użyć Dozer CustomFieldMapper, aby określić, czy właściwość jest leniwą kolekcją Hibernate, która nie jest załadowana, a następnie zwraca NULL.

Ale jeśli mamy powiązania dwukierunkowe, Hibernacja chętnie ładuje Wiele-do-Jedna strona i Dozer spróbuje skopiować właściwości, które zakończą się nieskończoną pętlą, powodując błąd StackOverflow.

Jedyną pracą, jaką znam, aby rozwiązać ten problem, jest używanie DTO i kopiowanie wymaganych właściwości tylko do czystych obiektów POJO (DTO) i następnie przekazywanie ich do XML/JSON. Bolesne jest jednak skomplikowane kopiowanie właściwości przez skomplikowany model domeny.

Czy istnieje inny czysty/prostszy sposób na (un) marshall elementów?

Odpowiedz

3

miałem analogiczny problem z przechodzącej plecy Hibernate'd vo i zawartych w aplikacji GWT, aw niektórych projektach spycharki z dobrym skutkiem, a także w innych projektach stosowane metody opisanej w this article, które w zasadzie zerowy jest proxy hibernacji przed rozruchem.

nadzieję, że pomoże ci

+0

Używana kod wspomniany w artykule, działa poprawnie. Ale musi przetestować na różnych typach odwzorowań relacji. Dziękuję Ci. –

4

mogę brzmieć zbyt konserwatywny, ale uważam, że używanie DTOs nadal dobry pomysł.

Złożoność mapowań jest proporcjonalna do szczegółowości interfejsu API zasobów, innymi słowy bardziej skomplikowane.

+2

DTO nadal działają dobrze, gdy są używane ostrożnie. Zwykle używam ich, gdy chcę zapewnić bogatszy model niż moje jednostki, często łącząc różne jednostki w bardziej zwarty model, z którym można łatwo wchodzić w interakcję, szczególnie z poziomu warstwy internetowej. – Gimby

+2

Zgadzam się z Gimby. Czasami musimy mieć DTO do reprezentowania danych, które mają być prezentowane w interfejsie użytkownika, które mogą być zbiorami wielu podmiotów. –

2

Weź łup w tej klasie: https://github.com/viniciuspires/reqlist/blob/master/src/main/java/org/reqlist/arch/HibernateAwareObjectMapper.java

używam Jacksona jako JSON serializatora/Deserializatora, i musiałem podjąć tę klasę i dodać Hibernate4Module na to, aby sprawdzić, czy Hibernate.isInitialized i nie przypadkowo zainicjować właściwość.

Potem trzeba tylko skonfigurować go jako ObjectMapper i przekazać go do tablicy MessageConverters, jak ja w tej linii:

https://github.com/viniciuspires/reqlist/blob/master/src/main/resources/META-INF/org.reqlist.context.xml#L21

To działało jak urok dla mnie.

Powiązane problemy