J'utilise Hibernate 3.2.7 sans Spring (ne demandez pas, le client ne supporte pas Spring) et je rencontre un problème avec mon implémentation du pattern open-session-in-view. Lorsque je persiste un objet dans la base de données en appelant save(), j'appelle ensuite get() sur cet objet pour charger les détails des objets enfants qui sont représentés par des clés étrangères dans la base de données. Le problème est que lorsque j'appelle get(), aucun des objets enfants n'est chargé. Si j'appelle la méthode get() à partir d'une nouvelle transaction, tout se charge comme prévu.
Voici un extrait de mon filtre de requête qui ouvre la session et crée la transaction :
HibernateUtil.openSession();
//get a transaction from JTA
transaction = (UserTransaction)new InitialContext().lookup("java:comp/UserTransaction");
transaction.begin();
// Call the next filter (continue request processing)
chain.doFilter(request, response);
// Commit and cleanup
log.finer("Committing the database transaction");
transaction.commit();
Voici un extrait de la méthode save de la couche de service qui enregistre la transaction :
session.setFlushMode(FlushMode.MANUAL);
contract.save();
//save the update to the database
session.flush();
Après la persistance de l'objet, la demande est transmise à une classe d'action struts qui appelle la méthode get() du service qui contient ce code pour charger le contrat :
Session session = HibernateUtil.getSession();
session.setFlushMode(FlushMode.MANUAL);
try {
contract = contract.get();
...
}
La même méthode d'action get est appelée lors du chargement d'un contrat persisté, ce qui fonctionne bien. Je sais donc que la méthode get() fonctionne correctement lorsqu'elle est isolée dans sa propre transaction. La seule fois où elle ne fonctionne pas, c'est lorsqu'elle est appelée juste après le save() à l'intérieur de la même transaction.