Printemps, @Transactionnelle et Hibernate Chargement Paresseux

je suis en utilisant spring + hibernate. Tous mes HibernateDAO utiliser directement sessionFactory.

J'ai de la couche application -> couche de service -> DAO couche et toutes les collections est lazly chargé.

Donc, le problème, c'est que dans le courant de la couche d'application(qui contient GUI/swing) je charge une entité à l'aide d'une couche de service méthode(qui contient @Transactional annotation) et je veux utiliser un lazly propriété de cet objet, mais obviusly la session est déjà fermé.

Quelle est la meilleure façon de résoudre ce problème?

MODIFIER

J'essaie d'utiliser un MethodInterceptor, mon idée est d'écrire un AroundAdvice pour toutes mes Entités et utiliser les annotations, ainsi par exemple:

//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
}

Pensez vous que cela peut-il fonctionner?
Le problème est, comment s'inscrire à l'intercepteur pour toutes mes entités sans faire dans le fichier xml?
Il y a un moyen de le faire avec l'annotation?

OriginalL'auteur blow | 2010-11-17