Salut,

Avec j'obtiens l'erruer suivante avec Hibernate :

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
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
org.hibernate.HibernateException: Illegal attempt to associate a collection with two open sessions
        at org.hibernate.collection.AbstractPersistentCollection.setCurrentSession(AbstractPersistentCollection.java:410)
        at org.hibernate.event.def.OnUpdateVisitor.processCollection(OnUpdateVisitor.java:40)
        at org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:101)
        at org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:61)
        at org.hibernate.event.def.AbstractVisitor.processEntityPropertyValues(AbstractVisitor.java:55)
        at org.hibernate.event.def.AbstractVisitor.process(AbstractVisitor.java:123)
        at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:268)
        at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:217)
        at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
        at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
        at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:507)
        at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:499)
        at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:495)
        at be.qspin.qats.business.HibernateUtility.setRow(HibernateUtility.java:99)
        at be.qspin.qats.business.Applicants.saveKeywords(Applicants.java:152)
        at be.qspin.qats.struts.action.ManageKeywordAction.execute(ManageKeywordAction.java:76)
        at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
        at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
        at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
        at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:368)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
        at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
        at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
        at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
        at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
        at java.lang.Thread.run(Thread.java:595)
j'ai compris que 2 sessions s'ouvrent en meme temps
mais je ne sais pas vraiment comment la résoudre. Pourtnat, a la fin de chaqsue transaction, je faire bien ma session...

voici mon code :

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
    public static void saveKeywords(Applicant appl, String[] key){
        Set s = new HashSet();
        if (!appl.getKeywords().isEmpty())
            s= appl.getKeywords();
        Keyword kw = new Keyword();
        for (int j = 0; j<key.length; j++){
            kw = (Keyword) HibernateUtility.getRow(Keyword.class, "id", new Integer(key[j]));
            if (kw !=null)
                s.add(kw);
        }
        if (!s.isEmpty()){
            appl.setKeywords(s);
            appl = (Applicant) HibernateUtility.setRow(appl);
        }
    }
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
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
/*
 * HibernateUtility.java
 *
 * Created on 18 novembre 2006, 13:43
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */
 
package be.qspin.qats.business;
 
import be.qspin.qats.struts.plugin.HibernatePlugIn;
 
import java.util.List;
import java.io.Serializable;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.Query;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;
 
public class HibernateUtility {
 
    /** Creates a new instance of HibernateUtility */
    public HibernateUtility() {
    }
 
    /*
     *provide a hibernate session
     *@return Session
     */
    public static Session getHibernateSession() {
        return HibernatePlugIn.getSessionFactory().openSession();
    }
 
    /*
     *return an record according to id
     *@param Class
     *@param Serializable
     *@return Object
     */
    public static Object getRow(Class aClass, Serializable id) {
        Session session = getHibernateSession();
        Object obj = session.get(aClass, id);
        session.close();
        return obj;
    }
 
    /*
     *return one record accoding to parameters
     *@param Class
     *@param String
     *@param String
     *@return Object
     */
    public static Object getRow(Class aClass, String attributeName, String attributeValue) {
        Session session = getHibernateSession();
        Criteria crit = session.createCriteria(aClass);
        crit.add(Restrictions.eq(attributeName, attributeValue));
        Object obj = crit.uniqueResult();
        session.close();
        return obj;
    }
 
    public static Object getRow(Class aClass, String attributeName, Integer attributeValue) {
        Session session = getHibernateSession();
        Criteria crit = session.createCriteria(aClass);
        crit.add(Restrictions.eq(attributeName, attributeValue));
        Object obj = crit.uniqueResult();
        session.close();
        return obj;
    }
 
    /*
     *return all record
     *@param Class
     *@return List
     */
    public static List getRow(Class aClass){
        Session session = getHibernateSession();
        Criteria crit = session.createCriteria(aClass);
        List result = crit.list();
        session.close();
        return result;
    }
 
 
    /*
     *record an object
     *@param Object
     */
    public static Object setRow(Object obj) {
        Session session = getHibernateSession();
        Transaction tx = session.beginTransaction();
        session.saveOrUpdate(obj);
        tx.commit();
        session.close();
        return obj;
    }
 
    public static List executeRequest(String request){
        System.out.println("Display query : "+request);
        Session session = getHibernateSession();
        Query query = session.createSQLQuery(request);
        return query.list();
    }
}
Merci pour l'aide