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 : 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;
	}
}
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 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>
- 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
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>