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 :

Erreur "org.hibernate.NonUniqueObjectException"


Sujet :

Hibernate Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 44
    Par défaut Erreur "org.hibernate.NonUniqueObjectException"
    Bonjour,

    Lors de l'enregistrement dans la base j'ai rencontrer l'erreur suivante:
    Aug 25, 2011 11:53:40 AM org.apache.myfaces.renderkit.ErrorPageWriter handleThrowable
    SEVERE: An exception occurred
    javax.faces.el.EvaluationException: javax.el.ELException: /home.xhtml at line 105 and column 118 action="#{parametreBean.save}": org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [fr.jsf.entity.Parametre#PARA_]
    at javax.faces.component._MethodExpressionToMethodBinding.invoke(_MethodExpressionToMethodBinding.java:96)
    at org.apache.myfaces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:100)
    at javax.faces.component.UICommand.broadcast(UICommand.java:120)
    at javax.faces.component.UIViewRoot._broadcastAll(UIViewRoot.java:978)
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:275)
    at javax.faces.component.UIViewRoot._process(UIViewRoot.java:1289)
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:716)
    at org.apache.myfaces.lifecycle.InvokeApplicationExecutor.execute(InvokeApplicationExecutor.java:34)
    at org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:171)
    at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:189)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at fr.jsf.web.filter.HibernateSessionRequestFilter.doFilter(HibernateSessionRequestFilter.java:29)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:563)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:403)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:301)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:162)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)
    Caused by: javax.el.ELException: /home.xhtml at line 105 and column 118 action="#{parametreBean.save}": org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [fr.jsf.entity.Parametre#PARA_]
    at org.apache.myfaces.view.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:95)
    at javax.faces.component._MethodExpressionToMethodBinding.invoke(_MethodExpressionToMethodBinding.java:88)
    ... 29 more
    Caused by: org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [fr.jsf.entity.Parametre#PARA_]
    at org.hibernate.engine.StatefulPersistenceContext.checkUniqueness(StatefulPersistenceContext.java:638)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:305)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:246)
    at org.hibernate.event.def.DefaultUpdateEventListener.performSaveOrUpdate(DefaultUpdateEventListener.java:57)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
    at org.hibernate.impl.SessionImpl.fireUpdate(SessionImpl.java:742)
    at org.hibernate.impl.SessionImpl.update(SessionImpl.java:730)
    at org.hibernate.impl.SessionImpl.update(SessionImpl.java:722)
    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:597)
    at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:345)
    at $Proxy14.update(Unknown Source)
    at fr.jsf.bean.ParametreDAOHibernate.alter(ParametreDAOHibernate.java:35)
    at fr.jsf.bean.ParametreRN.save(ParametreRN.java:21)
    at fr.jsf.bean.ParametreBean.save(ParametreBean.java:30)
    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:597)
    at org.apache.el.parser.AstValue.invoke(AstValue.java:262)
    at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278)
    at org.apache.myfaces.view.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:83)
    ... 30 more
    Dans ma base j'ai deux tables:


    Mon projet est organisé comme suit:


    1. Pour le package fr.jsf.bean :

    • Classe ParametreBean.java

    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
     
    package fr.jsf.bean;
     
    import java.util.ArrayList;
    import java.util.List;
    import javax.faces.bean.ManagedBean;
    import javax.faces.bean.SessionScoped;
    import javax.faces.component.UIInput;
    import javax.faces.context.ExternalContext;
    import javax.faces.context.FacesContext;
    import javax.faces.model.SelectItem;
    import org.apache.myfaces.custom.tree2.TreeNodeBase;
    import fr.jsf.entity.Application;
    import fr.jsf.entity.Parametre;
     
    @ManagedBean
    @SessionScoped
    public class ParametreBean {
     
    	private Parametre parametre= new Parametre();
    	private String selectedItem;  
    	private List<SelectItem> selectItems;
     
    	public void save(){
    		ParametreRN parametreRN= new ParametreRN();
    		Application appl=parametreRN.selectApplication(getSelectedItem());
    		getParametre();
    		parametre.setParaApplId(appl);
    		parametre.setParaAdministrable(5);
    		parametreRN.save(parametre);
    	}
     
    	public void alter(){
    		ParametreRN parametreRN= new ParametreRN();
    		Parametre param=parametreRN.selectParametre(parametre.getId());
    		param.setId(parametre.getId());
    		param.setParaDescription(parametre.getParaDescription());
    		UIInput app = (UIInput) FacesContext.getCurrentInstance().getViewRoot().findComponent("param:num1");
    		param.setParaNum1(parametre.getParaNum1());
    		app = (UIInput) FacesContext.getCurrentInstance().getViewRoot().findComponent("param:num2");
    		param.setParaNum2(parametre.getParaNum2());
    		param.setParaTexte1(parametre.getParaTexte1());
    		parametreRN.alter(param);
    	}
     
    	public void delete() {
    		ParametreRN parametreRN= new ParametreRN();
    		Application appl=parametreRN.selectApplication(getSelectedItem());
    		parametre.setParaApplId(appl);
    		parametreRN.delete(parametre);
    	}
     
    	public Parametre getParametre() {
    		return parametre;
    	}
     
    	public void setParametre(Parametre parametre) {
    		this.parametre = parametre;
    	}
     
    	public void clicLien() throws Exception{	
     
    		ParametreRN parametreRN= new ParametreRN();
    		FacesContext facesContext = FacesContext.getCurrentInstance();
    		ExternalContext extContext = facesContext.getExternalContext();
    		TreeNodeBase tnb = (TreeNodeBase) extContext.getRequestMap().get("node");
    		Parametre param=parametreRN.selectParametre(tnb.getDescription());
    		selectedItem=param.getParaApplId().getApplLiblong();
    		setParametre(param);
     
        }
     
    	public String getSelectedItem() {  
    		   return selectedItem;  
    		}  
     
    		public void setSelectedItem(String selectedItem) {  
    		    this.selectedItem = selectedItem;  
    		}  
     
    		public List<SelectItem> getSelectItems() { 
    			ParametreRN parametreRN= new ParametreRN();
    			List<Application> app=parametreRN.selectAllApplication();
    			selectItems = new ArrayList<SelectItem>();
    			for(int i=0;i<app.size();i++){
    				selectItems.add(new SelectItem(app.get(i).getApplLiblong(), app.get(i).getApplLiblong()));    
    			}
     
    		    return selectItems;  
    		}
     
    		public void setSelectItems(List<SelectItem> selectItems) {
    			this.selectItems = selectItems;
    		}  
     
    }
    • Classe ParametreDAO

    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
     
    package fr.jsf.bean;
     
    import java.util.List;
    import fr.jsf.entity.Application;
    import fr.jsf.entity.Parametre;
     
    public interface ParametreDAO {
     
    	public void save (Parametre parametre);
    	public void delete (Parametre parametre);
    	public void alter (Parametre parametre);
    	public Application selectApplication(String application);
    	public Parametre selectParametre(String parametre);
    	public List<Application> selectAllApplication();
    	public String selectApplicationId(String application);
    	public  List<String> selectParametreId(String parametre);
    	public List<Application> selectApplications();
    	public String selectParametreIde(String parametre);
     
    }
    • Classe ParametreDAOHibernate

    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
     
    package fr.jsf.bean;
     
    import java.util.List;
    import org.hibernate.Query;
    import org.hibernate.Session;
    import fr.jsf.entity.Application;
    import fr.jsf.entity.Parametre;
     
    public class ParametreDAOHibernate implements ParametreDAO {
     
    	private Session session;
     
    	public Session getSession() {
    		return session;
    	}
     
    	public void setSession(Session session) {
    		this.session = session;
    	}
     
    	public void save(Parametre parametre) {
    		parametre=(Parametre)session.get(Parametre.class, parametre);
    		session.save(parametre);
    		session.flush();
     
    	}
     
    	public void delete(Parametre parametre) {
    		session.delete(parametre);
    		session.flush();
     
    	}
     
    	public void alter(Parametre parametre) {
    		session.update(parametre);
    		session.flush();
     
    	}
     
    	public Application selectApplication(String application){
     
    		Query query = session.createQuery("SELECT a FROM Application as a WHERE a.applLiblong =:param").setParameter("param",application);
    		return (Application) query.uniqueResult();
    	}
     
    	public Parametre selectParametre(String parametre){
     
    		Query query = session.createQuery("SELECT p FROM Parametre as p WHERE p.id =:param").setParameter("param",parametre);
    		return (Parametre) query.uniqueResult();
    	}
     
    	@SuppressWarnings("unchecked")
    	public List<Application> selectAllApplication(){
     
    		return session.createCriteria(Application.class).list();
     
    	}
     
    	public String selectApplicationId(String application){
     
    		Query query = session.createQuery("SELECT a.id FROM Application a WHERE a.applLiblong=:param").setParameter("param",application);
    		return Integer.toString((Integer) query.uniqueResult());
    	}
     
    	@SuppressWarnings("unchecked")
    	public List<String> selectParametreId(String parametre){
     
    		Query query = session.createSQLQuery("SELECT p.PARA_MOTCLE FROM GEDPARAMETRAGE p WHERE p.PARA_APPL_ID=:param").setParameter("param",parametre);
    		return (List<String>) query.list();
    	}
     
    	@SuppressWarnings("unchecked")
    	public List<Application> selectApplications(){
     
    		Query query = session.createQuery("SELECT a.applLiblong FROM Application as a");
    		return  (List<Application>)query.list();
    	}
     
    	public String selectParametreIde(String parametre){
     
    		Query query = session.createQuery("SELECT p.id FROM Parametre p WHERE p.id=:param").setParameter("param",parametre);
    		return (String) query.uniqueResult();
    	}
     
    }
    • Classe ParametreRN

    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
     
    package fr.jsf.bean;
     
    import java.util.List;
    import fr.jsf.entity.Application;
    import fr.jsf.entity.Parametre;
    import fr.jsf.hibernate.DAOFactory;
     
    public class ParametreRN {
     
    	private ParametreDAO parametreDAO;
     
    	public ParametreRN(){
    		parametreDAO=DAOFactory.createParametreDAO();
    	}
     
    	public void save(Parametre parametre) {
     
    		if(parametreDAO.selectParametre(parametre.getId())==null)
    			parametreDAO.save(parametre);
    		else
    			parametreDAO.alter(parametre);
    	}
     
    	public void delete(Parametre parametre) {
    		parametreDAO.delete(parametre);
     
    	}
     
    	public void alter(Parametre parametre) {
    		parametreDAO.alter(parametre);
    	}
     
    	public Application selectApplication(String application){
     
    		return parametreDAO.selectApplication(application);
    	}
     
    	public Parametre selectParametre(String parametre){
     
    		return parametreDAO.selectParametre(parametre);
    	}
     
    	public List<Application> selectAllApplication(){
     
    		return  parametreDAO.selectAllApplication();
    	}
     
    	public String selectApplicationId(String application){
     
    		return parametreDAO.selectApplicationId(application);
    	}
     
    	public  List<String> selectParametreId(String parametre){
     
    		return parametreDAO.selectParametreId(parametre);
    	}
     
    	public List<Application> selectApplications(){
    		return parametreDAO.selectApplications();
    	}
     
    	public String selectParametreIde(String parametre){
    		return parametreDAO.selectParametreIde(parametre);
    	}
    }
    1. Pour le package fr.jsf.entity:

    • Classe Application

    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
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
     
    package fr.jsf.entity;
     
    import java.io.Serializable;
    import java.util.HashSet;
    import java.util.Set;
    import javax.persistence.CascadeType;
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.Id;
    import javax.persistence.OneToMany;
    import javax.persistence.Table;
     
    @Entity
    @Table(name="GEDAPPLICATION")
    public class Application implements Serializable{
     
    	private static final long serialVersionUID = 1L;
    	@Id
    	@Column(name="APPL_ID")
    	private Integer id;
    	@Column(name="APPL_LIBLONG")
    	private String applLiblong;
    	@Column(name="APPL_LIBCOURT")
    	private String applLibcourt;
    	@Column(name="APPL_PLANNING")
    	private Integer applPlannig;
    	@Column(name="APPL_FLAG_ACTIF")
    	private Integer applFlagActif;
    	@Column(name="APPL_GERE_FLUX")
    	private Integer applGereFlux;
    	@Column(name="APPL_PARAM_INSTANCE")
    	private Integer applParamInstance;
    	@Column(name="APPL_SERVICE")
    	private Integer applService;
    	@Column(name="APPL_FLAG_VIRTUEL")
    	private Integer applFlagVirtuel;
     
     
    	@OneToMany(mappedBy = "paraApplId", cascade = { CascadeType.ALL })
    	private Set<Parametre> apps =  new HashSet<Parametre>();
     
    	public Application(){super();}
    	public Integer getId() {
    		return id;
    	}
    	public void setId(Integer id) {
    		this.id = id;
    	}
    	public String getApplLiblong() {
    		return applLiblong;
    	}
    	public void setApplLiblong(String ApplLiblong) {
    		this.applLiblong = ApplLiblong;
     
    	}
     
    	public Set<Parametre> getApps() {
    		return apps;
    	}
     
    	public void setApps(Set<Parametre> apps) {
    		this.apps = apps;
    	}
    	public String getApplLibcourt() {
    		return applLibcourt;
    	}
    	public void setApplLibcourt(String applLibcourt) {
    		this.applLibcourt = applLibcourt;
    	}
    	public Integer getApplPlannig() {
    		return applPlannig;
    	}
    	public void setApplPlannig(Integer applPlannig) {
    		this.applPlannig = applPlannig;
    	}
    	public Integer getApplFlagActif() {
    		return applFlagActif;
    	}
    	public void setApplFlagActif(Integer applFlagActif) {
    		this.applFlagActif = applFlagActif;
    	}
    	public Integer getApplGereFlux() {
    		return applGereFlux;
    	}
    	public void setApplGereFlux(Integer applGereFlux) {
    		this.applGereFlux = applGereFlux;
    	}
    	public Integer getApplParamInstance() {
    		return applParamInstance;
    	}
    	public void setApplParamInstance(Integer applParamInstance) {
    		this.applParamInstance = applParamInstance;
    	}
    	public Integer getApplService() {
    		return applService;
    	}
    	public void setApplService(Integer applService) {
    		this.applService = applService;
    	}
    	public Integer getApplFlagVirtuel() {
    		return applFlagVirtuel;
    	}
    	public void setApplFlagVirtuel(Integer applFlagVirtuel) {
    		this.applFlagVirtuel = applFlagVirtuel;
    	}
    	@Override
    	public int hashCode() {
    		final int prime = 31;
    		int result = 1;
    		result = prime * result
    				+ ((applFlagActif == null) ? 0 : applFlagActif.hashCode());
    		result = prime * result
    				+ ((applFlagVirtuel == null) ? 0 : applFlagVirtuel.hashCode());
    		result = prime * result
    				+ ((applGereFlux == null) ? 0 : applGereFlux.hashCode());
    		result = prime * result
    				+ ((applLibcourt == null) ? 0 : applLibcourt.hashCode());
    		result = prime * result
    				+ ((applLiblong == null) ? 0 : applLiblong.hashCode());
    		result = prime
    				* result
    				+ ((applParamInstance == null) ? 0 : applParamInstance
    						.hashCode());
    		result = prime * result
    				+ ((applPlannig == null) ? 0 : applPlannig.hashCode());
    		result = prime * result
    				+ ((applService == null) ? 0 : applService.hashCode());
    		result = prime * result + ((apps == null) ? 0 : apps.hashCode());
    		result = prime * result + ((id == null) ? 0 : id.hashCode());
    		return result;
    	}
    	@Override
    	public boolean equals(Object obj) {
    		if (this == obj)
    			return true;
    		if (obj == null)
    			return false;
    		if (getClass() != obj.getClass())
    			return false;
    		Application other = (Application) obj;
    		if (applFlagActif == null) {
    			if (other.applFlagActif != null)
    				return false;
    		} else if (!applFlagActif.equals(other.applFlagActif))
    			return false;
    		if (applFlagVirtuel == null) {
    			if (other.applFlagVirtuel != null)
    				return false;
    		} else if (!applFlagVirtuel.equals(other.applFlagVirtuel))
    			return false;
    		if (applGereFlux == null) {
    			if (other.applGereFlux != null)
    				return false;
    		} else if (!applGereFlux.equals(other.applGereFlux))
    			return false;
    		if (applLibcourt == null) {
    			if (other.applLibcourt != null)
    				return false;
    		} else if (!applLibcourt.equals(other.applLibcourt))
    			return false;
    		if (applLiblong == null) {
    			if (other.applLiblong != null)
    				return false;
    		} else if (!applLiblong.equals(other.applLiblong))
    			return false;
    		if (applParamInstance == null) {
    			if (other.applParamInstance != null)
    				return false;
    		} else if (!applParamInstance.equals(other.applParamInstance))
    			return false;
    		if (applPlannig == null) {
    			if (other.applPlannig != null)
    				return false;
    		} else if (!applPlannig.equals(other.applPlannig))
    			return false;
    		if (applService == null) {
    			if (other.applService != null)
    				return false;
    		} else if (!applService.equals(other.applService))
    			return false;
    		if (apps == null) {
    			if (other.apps != null)
    				return false;
    		} else if (!apps.equals(other.apps))
    			return false;
    		if (id == null) {
    			if (other.id != null)
    				return false;
    		} else if (!id.equals(other.id))
    			return false;
    		return true;
    	}
    }
    • Classe Parametre

    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
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
     
    package fr.jsf.entity;
     
    import java.io.Serializable;
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.FetchType;
    import javax.persistence.Id;
    import javax.persistence.JoinColumn;
    import javax.persistence.ManyToOne;
    import javax.persistence.Table;
     
    @Entity
    @Table(name="GEDPARAMETRAGE")
    public class Parametre implements Serializable{
     
    	private static final long serialVersionUID = 1L;
    	@Id
    	@Column(name="PARA_MOTCLE")
    	private String id;
    	@Column(name="PARA_TEXTE1")
    	private String paraTexte1;
    	@Column(name="PARA_DESCRIPTION")
    	private String paraDescription;
    	@Column(name="PARA_NUM1")
    	private Integer  paraNum1;
    	@Column(name="PARA_NUM2")
    	private Integer  paraNum2;
    	@Column(name="PARA_ADMINISTRABLE")
    	private Integer  paraAdministrable;
    	@Column(name="PARA_FLAG_FONC")
    	private Integer  paraFlagFonc;
    	@Column(name="PARA_FLAG_TECH")
    	private Integer  paraFlagTech;
     
    	@ManyToOne(fetch=FetchType.LAZY)
    	@JoinColumn(name = "PARA_APPL_ID", nullable = false)
    	private Application paraApplId;
     
     
     
    	public Parametre(){super();}
     
    	public String getId() {
    		return id;
    	}
    	public void setId(String id) {
    		this.id = id;
    	}
     
    	public Application getParaApplId() {
    		return paraApplId;
    	}
     
    	public void setParaApplId(Application paraApplId) {
    		this.paraApplId = paraApplId;
    	}
     
    	public String getParaTexte1() {
    		return paraTexte1;
    	}
     
    	public void setParaTexte1(String paraTexte1) {
    		this.paraTexte1 = paraTexte1;
    	}
     
    	public String getParaDescription() {
    		return paraDescription;
    	}
     
    	public void setParaDescription(String paraDescription) {
    		this.paraDescription = paraDescription;
    	}
     
    	public Integer getParaNum1() {
    		return paraNum1;
    	}
     
    	public void setParaNum1(Integer paraNum1) {
    		this.paraNum1 = paraNum1;
    	}
     
    	public Integer getParaNum2() {
    		return paraNum2;
    	}
     
    	public void setParaNum2(Integer paraNum2) {
    		this.paraNum2 = paraNum2;
    	}
     
    	public Integer getParaFlagFonc() {
    		return paraFlagFonc;
    	}
     
    	public void setParaFlagFonc(Integer paraFlagFonc) {
    		this.paraFlagFonc = paraFlagFonc;
    	}
     
    	public Integer getParaFlagTech() {
    		return paraFlagTech;
    	}
     
    	public void setParaFlagTech(Integer paraFlagTech) {
    		this.paraFlagTech = paraFlagTech;
    	}
     
    	public Integer getParaAdministrable() {
    		return paraAdministrable;
    	}
     
    	public void setParaAdministrable(Integer paraAdministrable) {
    		this.paraAdministrable = paraAdministrable;
    	}
     
    	@Override
    	public int hashCode() {
    		final int prime = 31;
    		int result = 1;
    		result = prime * result + ((id == null) ? 0 : id.hashCode());
    		result = prime
    				* result
    				+ ((paraAdministrable == null) ? 0 : paraAdministrable
    						.hashCode());
    		result = prime * result
    				+ ((paraApplId == null) ? 0 : paraApplId.hashCode());
    		result = prime * result
    				+ ((paraDescription == null) ? 0 : paraDescription.hashCode());
    		result = prime * result
    				+ ((paraFlagFonc == null) ? 0 : paraFlagFonc.hashCode());
    		result = prime * result
    				+ ((paraFlagTech == null) ? 0 : paraFlagTech.hashCode());
    		result = prime * result
    				+ ((paraNum1 == null) ? 0 : paraNum1.hashCode());
    		result = prime * result
    				+ ((paraNum2 == null) ? 0 : paraNum2.hashCode());
    		result = prime * result
    				+ ((paraTexte1 == null) ? 0 : paraTexte1.hashCode());
    		return result;
    	}
     
    	@Override
    	public boolean equals(Object obj) {
    		if (this == obj)
    			return true;
    		if (obj == null)
    			return false;
    		if (getClass() != obj.getClass())
    			return false;
    		Parametre other = (Parametre) obj;
    		if (id == null) {
    			if (other.id != null)
    				return false;
    		} else if (!id.equals(other.id))
    			return false;
    		if (paraAdministrable == null) {
    			if (other.paraAdministrable != null)
    				return false;
    		} else if (!paraAdministrable.equals(other.paraAdministrable))
    			return false;
    		if (paraApplId == null) {
    			if (other.paraApplId != null)
    				return false;
    		} else if (!paraApplId.equals(other.paraApplId))
    			return false;
    		if (paraDescription == null) {
    			if (other.paraDescription != null)
    				return false;
    		} else if (!paraDescription.equals(other.paraDescription))
    			return false;
    		if (paraFlagFonc == null) {
    			if (other.paraFlagFonc != null)
    				return false;
    		} else if (!paraFlagFonc.equals(other.paraFlagFonc))
    			return false;
    		if (paraFlagTech == null) {
    			if (other.paraFlagTech != null)
    				return false;
    		} else if (!paraFlagTech.equals(other.paraFlagTech))
    			return false;
    		if (paraNum1 == null) {
    			if (other.paraNum1 != null)
    				return false;
    		} else if (!paraNum1.equals(other.paraNum1))
    			return false;
    		if (paraNum2 == null) {
    			if (other.paraNum2 != null)
    				return false;
    		} else if (!paraNum2.equals(other.paraNum2))
    			return false;
    		if (paraTexte1 == null) {
    			if (other.paraTexte1 != null)
    				return false;
    		} else if (!paraTexte1.equals(other.paraTexte1))
    			return false;
    		return true;
    	}
     
    }
    1. Pour le package fr.jsf.hibernate:

    • Classe DAOFactory

    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
     
    package fr.jsf.hibernate;
    import fr.jsf.bean.ParametreDAO;
    import fr.jsf.bean.ParametreDAOHibernate;
     
    public class DAOFactory {
     
    	public static ParametreDAO createParametreDAO(){
     
    		ParametreDAOHibernate parametreDAO = new ParametreDAOHibernate();
    		parametreDAO.setSession(HibernateUtil.getSf().getCurrentSession());
    		return parametreDAO;
    	}
     
    }
    • Classe HibernateUtil

    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
     
    package fr.jsf.hibernate;
     
    import org.hibernate.SessionFactory;
    import org.hibernate.cfg.Configuration;
     
    public class HibernateUtil {
     
    	private static final SessionFactory sF = buildSessionFactory();
     
    	public static SessionFactory buildSessionFactory(){
     
    		try{
    			Configuration cfg = new Configuration();
    			cfg.configure("hibernate.cfg.xml");
    			return cfg.buildSessionFactory();
    		}catch(Throwable ex){
    			System.out.println("Initial SessionFactory creation failed."+ex);
    			throw new ExceptionInInitializerError(ex);
    		}
    	}
     
    	public static SessionFactory getSf(){
     
    		return sF;
    	}
     
    }
    1. Pour le package fr.jsf.web.filter:

    • Classe HibernateSessionRequestFilter

    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
     
    package fr.jsf.web.filter;
     
    import java.io.IOException;
    import javax.servlet.*;
    import fr.jsf.hibernate.HibernateUtil;
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    import org.hibernate.SessionFactory;
    import org.hibernate.StaleObjectStateException;
     
    public class HibernateSessionRequestFilter implements Filter {
     
        private static Log log = LogFactory.getLog(HibernateSessionRequestFilter.class);
     
        private SessionFactory sf;
     
        public void doFilter(ServletRequest request,
                             ServletResponse response,
                             FilterChain chain)
                throws IOException, ServletException {
     
            try {
                log.debug("Starting a database transaction");
                sf.getCurrentSession().beginTransaction();
     
                // Call the next filter (continue request processing)
                chain.doFilter(request, response);
     
                // Commit and cleanup
                log.debug("Committing the database transaction");
                sf.getCurrentSession().getTransaction().commit();
     
            } catch (StaleObjectStateException staleEx) {
                log.error("This interceptor does not implement optimistic concurrency control!");
                log.error("Your application will not work until you add compensation actions!");
                // Rollback, close everything, possibly compensate for any permanent changes
                // during the conversation, and finally restart business conversation. Maybe
                // give the user of the application a chance to merge some of his work with
                // fresh data... what you do here depends on your applications design.
                throw staleEx;
            } catch (Throwable ex) {
                // Rollback only
                ex.printStackTrace();
                try {
                    if (sf.getCurrentSession().getTransaction().isActive()) {
                        log.debug("Trying to rollback database transaction after exception");
                        sf.getCurrentSession().getTransaction().rollback();
                    }
                } catch (Throwable rbEx) {
                    log.error("Could not rollback transaction after exception!", rbEx);
                }
     
                // Let others handle it... maybe another interceptor for exceptions?
                throw new ServletException(ex);
            }
        }
     
        public void init(FilterConfig filterConfig) throws ServletException {
            log.debug("Initializing filter...");
            log.debug("Obtaining SessionFactory from static HibernateUtil singleton");
            sf = HibernateUtil.getSf();
        }
     
        public void destroy() {}
     
    }
    Merci d'avance pour vos réponses.
    Images attachées Images attachées   

  2. #2
    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 : 45
    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
    sans regarder le code en détail, tu a probablement recréé un objet, avec le même identifiant qu'un objet déjà chargé par hibernate, et tu as essayé de le sauver.

    Typiquement, ce genre de code est une erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    unBean = session.load(.....);
    unAutreBean = new Bean();
    unAutreBean.setId(unBean.getId());
    session.save(unAutreBean);

  3. #3
    Rédacteur/Modérateur
    Avatar de Laurent.B
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    3 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 3 468
    Par défaut
    Bonjour,

    Soit ta méthode equals de l'objet en question est mal codée, soit tu crées quelque part une instance de l'objet avec les mêmes valeurs d'un objet déjà rattaché à la session.
    Passe en débug pour trouver où parce que ce qui est bizarre, c'est que l'attribut auquel ça fait référence semble incomplet :
    [fr.jsf.entity.Parametre#PARA_]
    T'as modifié la log à la main ou ça apparaît vraiment comme ça ?
    Responsable FAQ Eclipse | Maintiens et développe un des logiciels destinés aux rédacteurs sur developpez.com
    Gardons toujours à l'esprit que le forum constitue une base documentaire, dont l'utilité et la qualité dépendent du soin apporté à nos questions et nos réponses. Soyons polis, précis (dans le titre et dans le corps des questions), concis, constructifs et faisons de notre mieux pour respecter la langue française et sa grammaire. Merci pour nous (les modérateurs) mais aussi et surtout, merci pour vous.
    Problème solutionné => je vais au bas de la page et je clique sur le bouton (qui suite à mise à jour du forum, a légèrement changé d'aspect).

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 44
    Par défaut
    Oui, c'est bien comme ça que ça apparaît.

  5. #5
    Rédacteur/Modérateur
    Avatar de Laurent.B
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    3 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 3 468
    Par défaut
    Bien, dans ce cas j'ignore pourquoi mais ce n'est pas ça qui va résoudre ton problème, ça aurait juste permis de cibler l'attribut en question.

    Sinon, je pense que tchize_ a probablement raison, t'as du code qui ressemble à ça dans une des premières classes.

    Donc, passe en mode débug ! Prend le temps d'analyser le contenu des objets qui sont utilisés au moment de leur création/mise à jour et configure un point d'arrêt sur l'exception générée via le bouton J! de la vue Breakpoints.
    Responsable FAQ Eclipse | Maintiens et développe un des logiciels destinés aux rédacteurs sur developpez.com
    Gardons toujours à l'esprit que le forum constitue une base documentaire, dont l'utilité et la qualité dépendent du soin apporté à nos questions et nos réponses. Soyons polis, précis (dans le titre et dans le corps des questions), concis, constructifs et faisons de notre mieux pour respecter la langue française et sa grammaire. Merci pour nous (les modérateurs) mais aussi et surtout, merci pour vous.
    Problème solutionné => je vais au bas de la page et je clique sur le bouton (qui suite à mise à jour du forum, a légèrement changé d'aspect).

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 44
    Par défaut
    Citation Envoyé par Laurent.B Voir le message
    Bonjour,

    Soit ta méthode equals de l'objet en question est mal codée, soit tu crées quelque part une instance de l'objet avec les mêmes valeurs d'un objet déjà rattaché à la session.
    Passe en débug pour trouver où parce que ce qui est bizarre, c'est que l'attribut auquel ça fait référence semble incomplet : T'as modifié la log à la main ou ça apparaît vraiment comme ça ?
    Merci Laurent
    En fait, j'extrais mes données à partir de la table GEDAPPLICATION et GEDPARAMETRAGE pour ensuite avoir une arborescence qui contient la liste des applications et leurs paramétrages



    Quand je redémarre mon serveur Tomcat, les champs du formulaire sont vides mais au moment où je clique sur un paramètre d'une application, les informations du paramètre sont affichées dans le formulaire. Après, je change l'identifiant dans le formulaire par test pour créer un nouveau paramètre dans l'application Paramétrage et au moment de l'enregistrement je reçois l'erreur.
    Mais le truc que je comprends pas, en plus de l'erreur, c'est que quand je rafraichis la page le paramètre PARA_ reste toujours affiché, comme ci l'objet Parametre est resté enregistré dans la session.
    Images attachées Images attachées  

  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 : 45
    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
    vous voulez créer un nouvel objet, fait appel à new et utilisez un id qui n'existe pas encore. Avec hibernate, ne tentez pas de
    -> réutiliser un objet existant pour en faire un nouveau
    -> créer un nouvel objet pour éditer un objet existant

  8. #8
    Rédacteur/Modérateur
    Avatar de Laurent.B
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    3 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 3 468
    Par défaut
    Ok, PARA_ était une valeur et non pas un nom d'attribut... au temps pour moi.
    Responsable FAQ Eclipse | Maintiens et développe un des logiciels destinés aux rédacteurs sur developpez.com
    Gardons toujours à l'esprit que le forum constitue une base documentaire, dont l'utilité et la qualité dépendent du soin apporté à nos questions et nos réponses. Soyons polis, précis (dans le titre et dans le corps des questions), concis, constructifs et faisons de notre mieux pour respecter la langue française et sa grammaire. Merci pour nous (les modérateurs) mais aussi et surtout, merci pour vous.
    Problème solutionné => je vais au bas de la page et je clique sur le bouton (qui suite à mise à jour du forum, a légèrement changé d'aspect).

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 44
    Par défaut
    Citation Envoyé par Laurent.B Voir le message
    Ok, PARA_ était une valeur et non pas un nom d'attribut... au temps pour moi.
    Oui c'est une valeur accessible via la méthode getId() de la Classe Parametre.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 44
    Par défaut
    En fait j'ai changé @SessionScoped en @RequestScoped dans la classe ParametreBean. Avant avec @SessionScoped, au moment du chargement de l'application, les champs du formulaire s'affichent vides et quand je clique sur un paramètre d'une application dans l'arborescence, les donnés du paramètre s'afficheront dans le formulaire. Mais quand je rafraichis la page le formulaire reste toujours remplis tant que je n'ai pas redémarré le serveur de l'application.
    Avec @RequestScoped le formulaire s’initialise en rechargeant la page, mais je comprend pas pourquoi quand je clique sur un lien (paramètre: entité Parametre) de l'arborescence et quand les donnés du lien s’afficheront dans le formulaire et par la suit quand je clique sur le bouton Ajouter qui est codé de la façon suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public void save(){
    		ParametreRN parametreRN= new ParametreRN();
    		FacesContext facesContext = FacesContext.getCurrentInstance();
    		ExternalContext extContext = facesContext.getExternalContext();
    		String tnb = (String) extContext.getRequestMap().get("app");
    		System.out.println("get(id).toString()"+tnb);
    		System.out.println("parametre.id"+parametre.getId());
    	}
    Je reçois comme résultat:
    get(id).toString()null
    parametre.idnull

  11. #11
    Rédacteur/Modérateur
    Avatar de Laurent.B
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    3 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 3 468
    Par défaut
    Pourquoi remets-tu ton énorme screenshot ?
    Responsable FAQ Eclipse | Maintiens et développe un des logiciels destinés aux rédacteurs sur developpez.com
    Gardons toujours à l'esprit que le forum constitue une base documentaire, dont l'utilité et la qualité dépendent du soin apporté à nos questions et nos réponses. Soyons polis, précis (dans le titre et dans le corps des questions), concis, constructifs et faisons de notre mieux pour respecter la langue française et sa grammaire. Merci pour nous (les modérateurs) mais aussi et surtout, merci pour vous.
    Problème solutionné => je vais au bas de la page et je clique sur le bouton (qui suite à mise à jour du forum, a légèrement changé d'aspect).

Discussions similaires

  1. Réponses: 8
    Dernier message: 13/08/2014, 17h42
  2. Réponses: 1
    Dernier message: 03/07/2007, 14h57
  3. [MySQL] Supprimer les erreurs de syntaxe dues aux quotes
    Par gotenks dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 25/01/2006, 16h10

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