Używam spring + hibernate. Wszystkie moje HibernateDAO używają bezpośrednio sessionFactory.Spring, @Transactional i Hibernate Lazy Loading
Mam warstwę aplikacji -> warstwa serwisowa -> warstwa DAO i wszystkie kolekcje są załadowane leniwie.
Problem polega na tym, że czasami w warstwie aplikacji (która zawiera GUI/swing) ładuję encję przy użyciu metody warstwy usługi (która zawiera adnotację @Transactional) i chcę używać lazly własności tego obiektu, ale obviusly sesja jest już zamknięta.
Jaki jest najlepszy sposób rozwiązania tego problemu?
EDIT
próbuję użyć MethodInterceptor, mój pomysł jest napisanie AroundAdvice dla wszystkich moich podmiotów i użyć adnotacji, więc na przykład:
// Custom annotation, say that session is required for this method
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface SessionRequired {
// An AroundAdvice to intercept method calls
public class SessionInterceptor implements MethodInterceptor {
public Object invoke(MethodInvocation mi) throws Throwable {
bool sessionRequired=mi.getMethod().isAnnotationPresent(SessionRequired.class);
// Begin and commit session only if @SessionRequired
if(sessionRequired){
// begin transaction here
}
Object ret=mi.proceed();
if(sessionRequired){
// commit transaction here
}
return ret;
}
}
// An example of entity
@Entity
public class Customer implements Serializable {
@Id
Long id;
@OneToMany
List<Order> orders; // this is a lazy collection
@SessionRequired
public List<Order> getOrders(){
return orders;
}
}
// And finally in application layer...
public void foo(){
// Load customer by id, getCustomer is annotated with @Transactional
// this is a lazy load
Customer customer=customerService.getCustomer(1);
// Get orders, my interceptor open and close the session for me... i hope...
List<Order> orders=customer.getOrders();
// Finally use the orders
}
Myślisz, że ta praca ? Problem polega na tym, jak zarejestrować przechwytywanie dla wszystkich moich jednostek bez tego w pliku xml? Jest na to sposób z adnotacją?
@DaGGeRRz: to nie jest przydatne, jaka jest różnica między dwiema metodami w DAO, takimi jak loadLazly i loadEager i używaniem profilu pobierania? Nie ma różnicy, muszę napisać metodę differente, jeśli muszę załadować określony obiekt, który jest leniwy załadowany. – blow
Można na przykład zawinąć usługę/dao interceptorem, który ustawia profil pobierania "gui" po wywołaniu z gui. Daj mi znać, jeśli potrzebujesz więcej informacji na ten temat. – DaGGeRRz
@DaGGeRRz: na pewno dziękuję, to brzmi interesująco. – blow