J'utilise spring + hibernate. Tous mes HibernateDAO utilisent directement sessionFactory.Spring, @Transactional et Hibernate Lazy Loading
J'ai une couche application -> couche de service -> DAO et toutes les collections sont chargées paresseusement. Donc, le problème est que parfois dans la couche application (qui contient l'interface graphique/swing) je charge une entité en utilisant une méthode de couche service (qui contient l'annotation @Transactional) et je veux utiliser une propriété lazly de cet objet, mais obviusly la session est déjà fermée.
Quelle est la meilleure façon de résoudre ce problème?
EDIT
J'essaie d'utiliser un MethodInterceptor, mon idée est d'écrire un AroundAdvice pour toutes mes entités et annotations utiliser, 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 peut-il travailler ? Le problème est, comment enregistrer cet intercepteur pour toutes mes entités sans le faire dans le fichier XML? Il existe un moyen de le faire avec des annotations?
@DaGGeRRz: ce n'est pas utile, quelle est la différence d'avoir deux méthodes dans DAO comme loadLazly et loadEager et d'utiliser un fetch-profile? Il n'y a aucune différence, je dois écrire la méthode différente si j'ai besoin de charger un certain objet qui est paresseux chargé. – blow
Vous pouvez par exemple enrouler le service/dao avec un intercepteur qui définit le profil d'extraction "gui" lorsqu'il est appelé depuis l'interface graphique. Faites-moi savoir si vous avez besoin de plus de détails à ce sujet. – DaGGeRRz
@DaGGeRRz: bien sûr, ce son intéressant. – blow