Bonjour,
je travaille actuellement sur une application utilisant notamment Spring 2.5.6 et Hibernate 3.2.1.
J'utilise un JDK 1.4.2 et ne peut en utiliser un autre à cause de contrainte de plateforme.
En gros voilà la présentation du problème:
- j'ai une couche service sur laquelle les transactions sont définies par un TransactionProxyFactoryBean.
- j'ai une couche DAO qui effectue les accès aux données.
Jusque là rien de transcendant...
Au niveau modèle de données:
- une table PointStock
- une table Produit
Un PointStock et liés à plusieurs produits.
Concrètement en modèle objet: PointStock possède un attribut Map contenant des couples <String, Produit> (ce n'est pas forcément le plus logique mais je travail en particulier sur des exemples de code et non une application vouées à de la production)
Voilà maintenant le code suivant:
La première interrogation à la BDD me ramène ce qu'il faut et lors du getProduit l'instance de PersistentMap est liés à une Session "n".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 public class DAOImplementation extends HibernateTemplate implements DAOInterface { /* ... */ public PointStock insertProduitsForPointStock(Map produits, Long pointStockId){ PointStock pointStock = super.get(PointStock.class, pointStockId); pointStock.getProduits().putAll(produits); super.update(pointStock); return pointStock; } }
Et lorsque l'appel à l'update est créé, il semblerait qu'il y ait utilisation d'une nouvelle session et donc je me retrouve avec :
Au départ les deux appels (consultation/écriture) étaient séparés dans deux méthodes différentes appelées par mon Service. Ayant le problème cités, j'ai essayé de les ramener dans la même méthode DAO comme dans l'exemple ci-dessus mais même bloquage. Je ne vois pas du tout comment procédé pour garantir au sein d'une même transaction, l'utilisation d'une seule session.
Code : Sélectionner tout - Visualiser dans une fenêtre à part org.hibernate.HibernateException: Illegal attempt to associate a collection with two open sessions
Informations supplémentaires:
- hbm PointStock:
- OpenSessionInViewFilter dans le web.xml
Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 <hibernate-mapping package="test.metier"> <class name="PointStock"> <id name="idPointStock"> <generator class="native"/> </id> <property name="nom" /> <map name="produits" cascade="all"> <key column="idPointStock"/> <map-key type="string" column="keyProduit"/> <one-to-many class="Produit"/> </map> </class> </hibernate-mapping>
Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 <filter> <filter-name>openSessionInViewFilter</filter-name> <filter-class> org.springframework.orm.hibernate3.support.OpenSessionInViewFilter </filter-class> <init-param> <param-name>singleSession</param-name> <param-value>false</param-value> </init-param> </filter> <filter-mapping> <filter-name>openSessionInViewFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
Partager