HibernateTemplate et Illegal attempt to associate a collection with two open sessions
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:
Code:
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;
}
} |
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".
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 :
Code:
org.hibernate.HibernateException: Illegal attempt to associate a collection with two open sessions
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.
Informations supplémentaires:
- hbm PointStock:
Code:
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> |
- OpenSessionInViewFilter dans le web.xml
Code:
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> |