Estoy usando spring + hibernate. Todos mis HibernateDAO usan directamente sessionFactory.Spring, @Transactional e Hibernate Lazy Loading
Tengo la capa de aplicación -> capa de servicio -> la capa DAO y todas las colecciones están cargadas de forma diferida.
Entonces, el problema es que en algún momento en la capa de aplicación (que contiene GUI/swing) cargo una entidad usando un método de capa de servicio (que contiene anotación @Transactional) y quiero usar una propiedad poco común de este objeto, pero evidentemente la sesión ya está cerrada.
¿Cuál es la mejor manera de resolver este problema?
EDITAR
trato de usar un MethodInterceptor, mi idea es escribir un AroundAdvice para todos mis Entidades y el uso de anotación, así por ejemplo:
// 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
}
¿Cree que puede funcionar esto ? El problema es, ¿cómo registrar este interceptor para todas mis entidades sin hacerlo en el archivo xml? ¿Hay una manera de hacerlo con la anotación?
@DaGGeRRz: esto no es útil, ¿cuál es la diferencia de tener dos métodos en DAO como loadLazly y loadEager y usar un fetch-profile? No hay diferencia, tengo que escribir un método diferente si necesito cargar un determinado objeto que está cargado de forma diferida. – blow
Puede, por ejemplo, ajustar el servicio/dao con un interceptor que establece el perfil de búsqueda "gui" cuando se llama desde la interfaz gráfica de usuario. Avíseme si necesita más detalles sobre eso. – DaGGeRRz
@DaGGeRRz: seguro gracias, este sonido es interesante. – blow