[erreur] Illegal attempt to associate a collection with two open sessions
Salut,
Avec j'obtiens l'erruer suivante avec Hibernate :
Code:
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:
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:
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