IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Hibernate Java Discussion :

Same identifier sur un flush


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 92
    Par défaut Same identifier sur un flush
    Bonjour,

    J'ai un objet en session (BET). Et de façon aléatoire j'ai une erreur Hibernate connu qui est:

    org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [fr.ademe.evalad.model.utilisateurs.BET#2]
    at org.hibernate.engine.StatefulPersistenceContext.checkUniqueness(StatefulPersistenceContext.java:590)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:284)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:223)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:89)
    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.engine.CascadingAction$5.cascade(CascadingAction.java:218)
    at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:268)
    at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:216)
    at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:169)
    at org.hibernate.engine.Cascade.cascade(Cascade.java:130)
    at org.hibernate.event.def.AbstractFlushingEventListener.cascadeOnFlush(AbstractFlushingEventListener.java:131)
    at org.hibernate.event.def.AbstractFlushingEventListener.prepareEntityFlushes(AbstractFlushingEventListener.java:122)
    at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:65)
    at org.hibernate.event.def.DefaultAutoFlushEventListener.onAutoFlush(DefaultAutoFlushEventListener.java:35)
    at org.hibernate.impl.SessionImpl.autoFlushIfRequired(SessionImpl.java:969)
    at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1562)
    at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283)
    at fr.ademe.evalad.dao.impl.FicheSyntheseDAOImpl.getReponsesQuestionTableau(FicheSyntheseDAOImpl.java:128)
    at fr.ademe.evalad.services.fichesynthese.FicheSyntheseServiceImpl.initTableau(FicheSyntheseServiceImpl.java:874)
    at fr.ademe.evalad.services.fichesynthese.FicheSyntheseServiceImpl.initFormulaires(FicheSyntheseServiceImpl.java:691)
    at fr.ademe.evalad.services.fichesynthese.FicheSyntheseServiceImpl.getContenuFds(FicheSyntheseServiceImpl.java:597)
    at fr.ademe.evalad.delegate.DossierDelegate.updateAffichage(DossierDelegate.java:695)
    at fr.ademe.evalad.delegate.DossierDelegate.sauverFicheSyntheseDossier(DossierDelegate.java:536)
    at fr.ademe.evalad.web.controller.portails.dossier.DossierController.sauverFicheSyntheseDossier(DossierController.java:124)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:585)
    at com.sun.el.parser.AstValue.invoke(Unknown Source)
    at com.sun.el.MethodExpressionImpl.invoke(Unknown Source)
    at com.sun.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:68)
    at com.sun.facelets.el.LegacyMethodBinding.invoke(LegacyMethodBinding.java:69)
    at org.apache.myfaces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:61)
    at javax.faces.component.UICommand.broadcast(UICommand.java:109)
    at org.ajax4jsf.component.AjaxViewRoot.processEvents(AjaxViewRoot.java:184)
    at org.ajax4jsf.component.AjaxViewRoot.broadcastEvents(AjaxViewRoot.java:162)
    at org.ajax4jsf.component.AjaxViewRoot.processApplication(AjaxViewRoot.java:350)
    at org.apache.myfaces.lifecycle.InvokeApplicationExecutor.execute(InvokeApplicationExecutor.java:32)
    at org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:95)
    at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:70)
    at org.apache.myfaces.custom.ppr.PPRLifecycleWrapper.execute(PPRLifecycleWrapper.java:68)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:139)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
    at org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:246)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
    at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:141)
    at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:281)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
    at org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:301)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:525)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:875)
    at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
    at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
    at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
    at java.lang.Thread.run(Thread.java:595)
    Sur cette erreur on voit au moment du flush (enfin à ce que je comprend) que hibernate trouve deux objets BET avec l'identifiant 2. Or ce flush ce fait lors d'une recherche avec un criteria dont voici le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public List<Reponse> getReponsesQuestionTableau(int idDossier, int idQuestion) {
    		Session session = HibernateUtil.getSession();
    		Criteria crit = session.createCriteria(Reponse.class);
    		crit.add(Restrictions.eq(ID_DOSSIER, idDossier));
    		crit.add(Restrictions.eq(ID_QUESTION, idQuestion));
    		crit.addOrder(Order.asc(ORDRE));
    		return crit.list();	
    	}
    Cette fonction n'as pourtant rien à voir avec mon BET. Cette erreur se produit sur d'autre fonctions et de façons très aléatoire.

    Comment se fait il qu'une tel erreur arrive?

    Merci d'avance

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 92
    Par défaut Illegal attempt to associate
    Bonjour,

    depuis peu j'ai un problème concernant hibernate. Une erreur arrive de façon aléatoire sur mon application. A certain moment j'ai l'erreur suivante:

    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.WrapVisitor.processCollection(WrapVisitor.java:44)
    at org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:101)
    at org.hibernate.event.def.WrapVisitor.processValue(WrapVisitor.java:98)
    at org.hibernate.event.def.AbstractVisitor.processEntityPropertyValues(AbstractVisitor.java:55)
    at org.hibernate.event.def.DefaultFlushEntityEventListener.wrapCollections(DefaultFlushEntityEventListener.java:192)
    at org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:125)
    at org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:196)
    at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:76)
    at org.hibernate.event.def.DefaultAutoFlushEventListener.onAutoFlush(DefaultAutoFlushEventListener.java:35)
    at org.hibernate.impl.SessionImpl.autoFlushIfRequired(SessionImpl.java:969)
    at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1562)
    at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283)
    at org.hibernate.impl.CriteriaImpl.uniqueResult(CriteriaImpl.java:305)
    at fr.ademe.evalad.dao.impl.DossierDAOImpl.getDossier(DossierDAOImpl.java:136)
    at fr.ademe.evalad.services.operation.DossierServiceImpl.getDossier(DossierServiceImpl.java:53)
    at fr.ademe.evalad.delegate.DossierDelegate.<init>(DossierDelegate.java:83)
    at fr.ademe.evalad.web.controller.portails.dossier.DossierController.<init>(DossierController.java:67)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at java.lang.Class.newInstance0(Unknown Source)
    at java.lang.Class.newInstance(Unknown Source)
    at org.apache.myfaces.shared_impl.util.ClassUtils.newInstance(ClassUtils.java:277)
    at org.apache.myfaces.shared_impl.util.ClassUtils.newInstance(ClassUtils.java:268)
    at org.apache.myfaces.config.ManagedBeanBuilder.buildManagedBean(ManagedBeanBuilder.java:49)
    at org.apache.myfaces.el.VariableResolverImpl.resolveVariable(VariableResolverImpl.java:314)
    at
    Voici la fonction qui renvoie cette erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public Dossier getDossier(String identifiantDosBen) {
    		Session session = HibernateUtil.getSession();
    		Criteria criteria = session.createCriteria(Dossier.class);
    		criteria.add(Restrictions.eq(DOS_MOB, identifiantDosBen));
    		return (Dossier) criteria.uniqueResult();
    	}
    Je ne comprend pas ce qui se passe. Sachant que l'erreur peut se produire sur d'autres fonction toujours de façon aléatoire.

    Que veux dire cette erreur et comment puis-je resoudre ce problème.

    Merci

  3. #3
    Inactif  
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    2 189
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 189
    Par défaut
    J'ai également rencontré ce problème que j'ai résolu en récupérant la session et en la fermant

    Puis dans les relations qui utilisaient ces objets mettre le cascading en evict

    @Cascade({org.hibernate.annotations.CascadeType.EVICT})

  4. #4
    Inactif  
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    2 189
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 189
    Par défaut
    La raison est que dans ta session un objet portant le même id est déjà utilisé tu ne fermes pas les sessions entre deux appels

    Il existe également une solution beaucoup moins propre qui fait un session.evict de ton objet ... ou un LockMode.READ du même objet

  5. #5
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Ca se produit quand tu met deux objet dans la session ayant le meme id. Cependant, ceci ne se remarque parfois pas avant le flush. Exemple de code qui peut poser probleme


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    TrucABets t = session.load(.....);
    Bet b = new Bet();
    b.setId(12345);
    t.getBets().add(b); // rappelons que b ne fait pas encore partie de la session
    //.....
    session.flush(); // t est fushé, la collection si elle est auto update est flushée avec, b est donc commité et ajouté dans la session, si il existait déjà un autre Bet avec l'id  12345 dans la session, c'est l'erreur
    Typiquement, si à un moment dans ton code tu appelle toi meme setId(), ca sent déjà mauvais, laisse hibernate les gérer tout seul.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 92
    Par défaut
    Mon problème semble résolu. Cela venait de certaines cascades qui posait problème. Pour information je n'utilise qu'une seul session Hibernate que je ne ferme jamais du coup. Cette session est donc partagé et j'utilise ce qui est préconisé par Hibernate.

    Sinon une autre erreur se produit de façon aléatoire mais toujours sur la même fonction et toujours sur la même instructions:

    org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [fr.ademe.evalad.model.utilisateurs.Contacts#106]
    at org.hibernate.impl.SessionFactoryImpl$1.handleEntityNotFound(SessionFactoryImpl.java:377)
    at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:145)
    at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:179)
    at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:103)
    at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:878)
    at org.hibernate.impl.SessionImpl.internalLoad(SessionImpl.java:846)
    at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:557)
    at org.hibernate.type.EntityType.resolve(EntityType.java:379)
    at org.hibernate.type.EntityType.replace(EntityType.java:259)
    at org.hibernate.type.CollectionType.replaceElements(CollectionType.java:485)
    at org.hibernate.type.CollectionType.replace(CollectionType.java:552)
    at org.hibernate.type.TypeFactory.replace(TypeFactory.java:482)
    at org.hibernate.event.def.DefaultMergeEventListener.copyValues(DefaultMergeEventListener.java:340)
    at org.hibernate.event.def.DefaultMergeEventListener.entityIsPersistent(DefaultMergeEventListener.java:153)
    at org.hibernate.event.def.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:126)
    at org.hibernate.impl.SessionImpl.fireMerge(SessionImpl.java:687)
    at org.hibernate.impl.SessionImpl.merge(SessionImpl.java:669)
    at org.hibernate.engine.CascadingAction$6.cascade(CascadingAction.java:245)
    at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:268)
    at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:216)
    at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:169)
    at org.hibernate.engine.Cascade.cascadeCollectionElements(Cascade.java:296)
    at org.hibernate.engine.Cascade.cascadeCollection(Cascade.java:242)
    at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:219)
    at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:169)
    at org.hibernate.engine.Cascade.cascade(Cascade.java:130)
    at org.hibernate.event.def.DefaultMergeEventListener.cascadeOnMerge(DefaultMergeEventListener.java:407)
    at org.hibernate.event.def.DefaultMergeEventListener.entityIsPersistent(DefaultMergeEventListener.java:152)
    at org.hibernate.event.def.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:126)
    at org.hibernate.event.def.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:53)
    at org.hibernate.impl.SessionImpl.fireMerge(SessionImpl.java:677)
    at org.hibernate.impl.SessionImpl.merge(SessionImpl.java:661)
    at org.hibernate.impl.SessionImpl.merge(SessionImpl.java:665)
    at fr.ademe.evalad.delegate.bet.SessionBET.deleteContact(SessionBET.java:461)
    at fr.ademe.evalad.web.controller.portails.BET.ProfilBETController.deleteContact(ProfilBETController.java:214)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:585)
    at com.sun.el.parser.AstValue.invoke(Unknown Source)
    at com.sun.el.MethodExpressionImpl.invoke(Unknown Source)
    at com.sun.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:68)
    at com.sun.facelets.el.LegacyMethodBinding.invoke(LegacyMethodBinding.java:69)
    at org.apache.myfaces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:61)
    at javax.faces.component.UICommand.broadcast(UICommand.java:109)
    at javax.faces.component.UIData.broadcast(UIData.java:517)
    at org.ajax4jsf.component.AjaxViewRoot.processEvents(AjaxViewRoot.java:184)
    at org.ajax4jsf.component.AjaxViewRoot.broadcastEvents(AjaxViewRoot.java:162)
    at org.ajax4jsf.component.AjaxViewRoot.processApplication(AjaxViewRoot.java:350)
    at org.apache.myfaces.lifecycle.InvokeApplicationExecutor.execute(InvokeApplicationExecutor.java:32)
    at org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:95)
    at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:70)
    at org.apache.myfaces.custom.ppr.PPRLifecycleWrapper.execute(PPRLifecycleWrapper.java:68)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:139)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
    at org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:246)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
    at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:141)
    at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:281)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
    at org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:301)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
    Voici la fonction qui produit l'erreur:

    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
     
    /**
             * Suppresion du contact
             */
    	public void deleteContact() {
    		if(contact != null){
    			boolean contactSupprime = false;
    			try{
    				Session l_oSession = HibernateUtil.getSession();
    				creerAssociationContact();
    				if(bet.getIdBET() > 0){
    					bet = (BET) l_oSession.merge(bet);//l'erreur se produit ici
    					creerAssociationContact(contact);
    					contact = (Contacts) l_oSession.merge(contact);
    					contactSupprime = bet.getListContacts().remove(contact);
    						l_oSession.delete(contact);
    						l_oSession.flush();
    				}
    				else{
    					contactSupprime = bet.getListContacts().remove(contact);
    					if(!contactSupprime)
    						throw new Exception("Impossible de trouver l'élément dans la liste");
    				}
    				contact = null;
    			}
    			catch (Exception e) {
    				log.error("Impossible de supprimer le contact");
    				log.debug("Contact supprimé de la liste avant flush: " + contactSupprime);
    				if(!contactSupprime && contact != null){
    					log.debug("hashCode du contact " + contact.getIdcontact() + " :" + contact.hashCode());
    					log.debug("hashCode des contacts dans la liste des BETs:");
    					for(Contacts item:bet.getListContacts())
    						log.debug("hashCode du contact " + item.getIdcontact() + " :" + item.hashCode());
    				}
    				e.printStackTrace();
    			}
    		}
    	}
    En gros j'ai un objet BET qui contient une liste de contact. Et apparemment lorsque je merge l'objet BET afin d'avoir l'intégrité de mes données cette erreur se produit.

    Voici ma relation entre le BET et le contact

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     <set name="listContacts" lazy="false" order-by="idcontact" cascade="all-delete-orphan,merge" inverse="true">
                <key column="idBET"/>
                <one-to-many class="fr.ademe.evalad.model.utilisateurs.Contacts" not-found="ignore"/>
            </set>
    Merci de votre aide

  7. #7
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par demanghonj Voir le message
    Mon problème semble résolu. Cela venait de certaines cascades qui posait problème. Pour information je n'utilise qu'une seul session Hibernate que je ne ferme jamais du coup. Cette session est donc partagé et j'utilise ce qui est préconisé par Hibernate.
    Et bien soit tu revois ton design soit tu recode l'entièreté de l'implémentation de base. La Session Hibernate n'est pas ThreadSafe et à ce titre ne peux pas être partagée entre plusieurs thread. Et comme, avec le lazy, des appels à la session peuvent avoir lieu n'importe quand en background, tu ne peux pas controler les appels à la session. Donc les objets retournés pas une session hibernate ne peuvent pas non plus être partagés.

    Les erreurs que tu rencontre peuvent être dues à çà ou d'autre raison, mais tant que tu n'aura pas de garanties que deux threads ne peuvent pas accéder à la session en même temps, rien ne sert de debugger.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 92
    Par défaut
    Et bien soit tu revois ton design soit tu recode l'entièreté de l'implémentation de base. La Session Hibernate n'est pas ThreadSafe et à ce titre ne peux pas être partagée entre plusieurs thread. Et comme, avec le lazy, des appels à la session peuvent avoir lieu n'importe quand en background, tu ne peux pas controler les appels à la session. Donc les objets retournés pas une session hibernate ne peuvent pas non plus être partagés.
    Ceci ne la rend pas ThreadSafe ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <property name="current_session_context_class">thread</property>
    Voici ma méthode pour récupérer ma Session:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public static synchronized Session getSession() throws HibernateException {
    		Session s = (Session) threadSession.get();
    		if (s == null) {
    			log.info("Création d'une nouvelle session");
    			s = sessionFactory.openSession();
    			threadSession.set(s);
    		}
    		//log.debug("Session:" + s.toString());
    		return s;
    	}
    Tous cela est mauvais?

Discussions similaires

  1. Erreurs sur les figures : "same identifier".
    Par Luke58 dans le forum Erreurs - Avertissements
    Réponses: 5
    Dernier message: 20/08/2010, 19h50
  2. Réponses: 4
    Dernier message: 07/04/2009, 14h07
  3. ORA-00904: invalid identifier sur le last query
    Par decksroy dans le forum Forms
    Réponses: 4
    Dernier message: 24/01/2008, 12h03
  4. Réponses: 2
    Dernier message: 27/07/2007, 09h21
  5. Réponses: 7
    Dernier message: 04/07/2005, 22h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo