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

JPA Java Discussion :

Problème de persistence d'une double liaison bidirectionnelle


Sujet :

JPA Java

  1. #1
    Membre averti
    Inscrit en
    Juillet 2003
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 54
    Par défaut Problème de persistence d'une double liaison bidirectionnelle
    Bonjour,

    je n'arrive pas à persister un objet qui possède deux doubles liaisons bidirectionnelles. J'ai un objet qui possède une liste de taches. Une tache pointe vers l'objet propriétaire de la liste. Cette même liste est également contenu dans un autre objet "Thread". La tâche pointe donc également sur le thread qui contient cette liste.
    Or lorsque je persiste mon objet, lors de la persistance de la tâche, il me dit qu'il faut d'abord persister le thread. Mais si je persiste d'abord le thread, il me dit qu'il faut persister l'objet...
    Comment faire???
    Merci de votre aide...

  2. #2
    Membre Expert Avatar de willoi
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 355
    Par défaut
    Il faut préciser si tu persiste en cascade ou non avec par exemple :
    Dans ton anotation @ManyToMany ou @ManyToOne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cascade = CascadeType.REFRESH

  3. #3
    Membre averti
    Inscrit en
    Juillet 2003
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 54
    Par défaut
    j'ai mis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cascade = CascadeType.ALL

  4. #4
    Membre Expert Avatar de willoi
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 355
    Par défaut
    Ben cela veut dire que c'est répercuté sur toute la grappe d'objet.
    Si tu veux éviter cela, positionne-le à refresh ou none

  5. #5
    Membre averti
    Inscrit en
    Juillet 2003
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 54
    Par défaut
    mais j'aimerais justement que tout soit persisté d'un coup.

  6. #6
    Membre Expert Avatar de willoi
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 355
    Par défaut
    Peux-tu montrer ce que tu essaye de faire ?

  7. #7
    Membre averti
    Inscrit en
    Juillet 2003
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 54
    Par défaut
    voici une partie du schéma de ma base:



    voici le code des deux classes:

    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
    /**
     * 
     */
     
     
    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="BARRAGE_JAMMING_PARAMS")
    public class Barrage_jamming_params implements Serializable {
     
    	/**
             * 
             */
    	private static final long serialVersionUID = -2704197442583215687L;
     
    	@Id
    	@Column(name="PARAM_ID",length=36)
    	private String paramID;
     
    	@Column(name="JAMMING_SPEED")
    	private int jammingSpeed;
     
    	@Column(name="JITTER")
    	private int jitter;
     
    	@OneToMany(mappedBy="params",cascade={CascadeType.ALL})
    	private Set<Barrage_Threat> barrageThreat = new HashSet<Barrage_Threat>();
     
    	/**
             * This constructor use No argument to create a new Barrage_Jamming_Params
             */
    	public Barrage_jamming_params() {
    	}
     
    	/**
             * @param paramID
             * @param jammingSpeed
             * @param jitter
             * @param barrageThreat
             */
    	public Barrage_jamming_params(String paramID, int jammingSpeed, int jitter,
    			Set<Barrage_Threat> barrageThreat) {
    		this.paramID = paramID;
    		this.jammingSpeed = jammingSpeed;
    		this.jitter = jitter;
    		this.barrageThreat = barrageThreat;
    	}
     
    	/**
             * @return the paramID
             */
    	public String getParamID() {
    		return paramID;
    	}
     
    	/**
             * @param paramID the paramID to set
             */
    	public void setParamID(String paramID) {
    		this.paramID = paramID;
    	}
     
    	/**
             * @return the jammingSpeed
             */
    	public int getJammingSpeed() {
    		return jammingSpeed;
    	}
     
    	/**
             * @param jammingSpeed the jammingSpeed to set
             */
    	public void setJammingSpeed(int jammingSpeed) {
    		this.jammingSpeed = jammingSpeed;
    	}
     
    	/**
             * @return the jitter
             */
    	public int getJitter() {
    		return jitter;
    	}
     
    	/**
             * @param jitter the jitter to set
             */
    	public void setJitter(int jitter) {
    		this.jitter = jitter;
    	}
     
    	/**
             * @return the barrageThreat
             */
    	public Set<Barrage_Threat> getBarrageThreat() {
    		return barrageThreat;
    	}
     
    	/**
             * @param barrageThreat the barrageThreat to set
             */
    	public void setBarrageThreat(Set<Barrage_Threat> barrageThreat) {
    		this.barrageThreat = barrageThreat;
    	}
     
    }
    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
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    /**
     * 
     */
     
    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.FetchType;
    import javax.persistence.Id;
    import javax.persistence.JoinColumn;
    import javax.persistence.ManyToOne;
    import javax.persistence.OneToMany;
    import javax.persistence.Table;
     
     
    @Entity
    @Table(name="BARRAGE_THREAT")
    public class Barrage_Threat implements Serializable {
     
    	/**
             * 
             */
    	private static final long serialVersionUID = -2663131395781782757L;
     
    	@Id
    	@Column(name="THREAT_ID",length=36)
    	private String threatID;
     
    	@ManyToOne(fetch=FetchType.EAGER)
    	@JoinColumn(name = "BARRAGE_JAMMING_PARAMS_ID")
    	private Barrage_jamming_params params;
     
    	@ManyToOne(fetch=FetchType.EAGER)
    	@JoinColumn(name = "TASK_ID")
    	private Task task;
     
    	@Column(name="EQUIPMENT_TYPE_NAME",length=256)
    	private String equipmentTypeName;
     
    	@Column(name="DETECTION_RATE")
    	private int detectionRate;
     
    	@Column(name="SEQUENTIAL_STEP")
    	private int sequentialStep;
     
    	@Column(name="THRESHOLD_MIN")
    	private int thresholdMin;
     
    	@Column(name="THRESHOLD_MAX")
    	private int thresholdMax;
     
    	@Column(name="POWER_LEVEL")
    	private int powerLevel;
     
    	@OneToMany(mappedBy="barrageThreat",cascade={CascadeType.ALL})
    	private Set<Threat_Sub_Range> subRange = new HashSet<Threat_Sub_Range>();
     
     
    	/**
             * This constructor use No argument to create a new Barrage_Threat
             */
    	public Barrage_Threat() {
    	}
     
    	/**
             * @param threatID
             * @param params
             * @param task
             * @param equipmentTypeName
             * @param detectionRate
             * @param sequentialStep
             * @param thresholdMin
             * @param thresholdMax
             * @param powerLevel
             * @param subRange
             */
    	public Barrage_Threat(String threatID, Barrage_jamming_params params,
    			Task task, String equipmentTypeName, int detectionRate,
    			int sequentialStep, int thresholdMin, int thresholdMax,
    			int powerLevel, Set<Threat_Sub_Range> subRange) {
    		this.threatID = threatID;
    		this.params = params;
    		this.task = task;
    		this.equipmentTypeName = equipmentTypeName;
    		this.detectionRate = detectionRate;
    		this.sequentialStep = sequentialStep;
    		this.thresholdMin = thresholdMin;
    		this.thresholdMax = thresholdMax;
    		this.powerLevel = powerLevel;
    		this.subRange = subRange;
    	}
     
     
    	/**
             * @return the params
             */
    	public Barrage_jamming_params getParams() {
    		return params;
    	}
     
    	/**
             * @param params the params to set
             */
    	public void setParams(Barrage_jamming_params params) {
    		this.params = params;
    	}
     
    	/**
             * @return the task
             */
    	public Task getTask() {
    		return task;
    	}
     
    	/**
             * @param task the task to set
             */
    	public void setTask(Task task) {
    		this.task = task;
    	}
     
    	/**
             * @return the detectionRate
             */
    	public int getDetectionRate() {
    		return detectionRate;
    	}
     
    	/**
             * @param detectionRate the detectionRate to set
             */
    	public void setDetectionRate(int detectionRate) {
    		this.detectionRate = detectionRate;
    	}
     
    	/**
             * @return the sequentialStep
             */
    	public int getSequentialStep() {
    		return sequentialStep;
    	}
     
    	/**
             * @param sequentialStep the sequentialStep to set
             */
    	public void setSequentialStep(int sequentialStep) {
    		this.sequentialStep = sequentialStep;
    	}
     
    	/**
             * @return the thresholdMin
             */
    	public int getThresholdMin() {
    		return thresholdMin;
    	}
     
    	/**
             * @param thresholdMin the thresholdMin to set
             */
    	public void setThresholdMin(int thresholdMin) {
    		this.thresholdMin = thresholdMin;
    	}
     
    	/**
             * @return the thresholdMax
             */
    	public int getThresholdMax() {
    		return thresholdMax;
    	}
     
    	/**
             * @param thresholdMax the thresholdMax to set
             */
    	public void setThresholdMax(int thresholdMax) {
    		this.thresholdMax = thresholdMax;
    	}
     
    	/**
             * @return the powerLevel
             */
    	public int getPowerLevel() {
    		return powerLevel;
    	}
     
    	/**
             * @param powerLevel the powerLevel to set
             */
    	public void setPowerLevel(int powerLevel) {
    		this.powerLevel = powerLevel;
    	}
     
    	/**
             * @return the subRange
             */
    	public Set<Threat_Sub_Range> getSubRange() {
    		return subRange;
    	}
     
    	/**
             * @param subRange the subRange to set
             */
    	public void setSubRange(Set<Threat_Sub_Range> subRange) {
    		this.subRange = subRange;
    	}
     
    	/**
             * @return the threatID
             */
    	public String getThreatID() {
    		return threatID;
    	}
     
    	/**
             * @param threatID the threatID to set
             */
    	public void setThreatID(String threatID) {
    		this.threatID = threatID;
    	}
     
    	/**
             * @return the equipmentTypeName
             */
    	public String getEquipmentTypeName() {
    		return equipmentTypeName;
    	}
     
    	/**
             * @param equipmentTypeName the equipmentTypeName to set
             */
    	public void setEquipmentTypeName(String equipmentTypeName) {
    		this.equipmentTypeName = equipmentTypeName;
    	}
     
    }
    et voici l'erreur quand je persiste mon objet principal:

    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
    Caused by: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: thales_isr.pojo.mission.Barrage_Threat.params -> thales_isr.pojo.mission.Barrage_jamming_params
    	at org.hibernate.engine.CascadingAction$9.noCascade(CascadingAction.java:353)
    	at org.hibernate.engine.Cascade.cascade(Cascade.java:139)
    	at org.hibernate.event.def.AbstractSaveEventListener.cascadeBeforeSave(AbstractSaveEventListener.java:431)
    	at org.hibernate.event.def.DefaultPersistEventListener.entityIsPersistent(DefaultPersistEventListener.java:110)
    	at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:84)
    	at org.hibernate.impl.SessionImpl.firePersistOnFlush(SessionImpl.java:644)
    	at org.hibernate.impl.SessionImpl.persistOnFlush(SessionImpl.java:636)
    	at org.hibernate.engine.CascadingAction$9.cascade(CascadingAction.java:323)
    	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.AbstractSaveEventListener.cascadeAfterSave(AbstractSaveEventListener.java:456)
    	at org.hibernate.event.def.DefaultPersistEventListener.entityIsPersistent(DefaultPersistEventListener.java:111)
    	at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:84)
    	at org.hibernate.impl.SessionImpl.firePersistOnFlush(SessionImpl.java:644)
    	at org.hibernate.impl.SessionImpl.persistOnFlush(SessionImpl.java:636)
    	at org.hibernate.engine.CascadingAction$9.cascade(CascadingAction.java:323)
    	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.AbstractSaveEventListener.cascadeAfterSave(AbstractSaveEventListener.java:456)
    	at org.hibernate.event.def.DefaultPersistEventListener.entityIsPersistent(DefaultPersistEventListener.java:111)
    	at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:84)
    	at org.hibernate.impl.SessionImpl.firePersistOnFlush(SessionImpl.java:644)
    	at org.hibernate.impl.SessionImpl.persistOnFlush(SessionImpl.java:636)
    	at org.hibernate.engine.CascadingAction$9.cascade(CascadingAction.java:323)
    	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.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.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:26)
    	at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
    	at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
    	at org.hibernate.ejb.AbstractEntityManagerImpl$1.beforeCompletion(AbstractEntityManagerImpl.java:515)
    	... 29 more
    
    

  8. #8
    Membre Expert Avatar de willoi
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 355
    Par défaut
    et le code qui effectue la persistence ?
    Ainsi que le code du modele ?

  9. #9
    Membre averti
    Inscrit en
    Juillet 2003
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 54
    Par défaut
    désolé, je m'en suis rendu compte entre temps, j'ai mis à jour...

  10. #10
    Membre Expert Avatar de willoi
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 355
    Par défaut
    Et pour persister, tu utilises quoi ?
    Quel methode et quelle classe ?
    JpaTemplate ?

  11. #11
    Membre averti
    Inscrit en
    Juillet 2003
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 54
    Par défaut
    je peux afficher mon persistence.xml si tu le souhaite, pour le reste je fais un simple


  12. #12
    Membre Expert Avatar de willoi
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 355
    Par défaut
    Il n'est peut-etre pas possible de préciser cascade ALL sur les 2 entités.

    Tu peux tester ?

  13. #13
    Membre averti
    Inscrit en
    Juillet 2003
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 54
    Par défaut
    je vais voir en mettant "none" dans Barrage_Jamming_Params.

  14. #14
    Membre averti
    Inscrit en
    Juillet 2003
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 54
    Par défaut
    Merci! ça a l'air de fonctionner, je n'ai plus d'erreur. Mais il faut bien persister en premier Barrage_Jamming_Params auquel j'ai mis cascadeType.REFRESH (None n'existant pas dans les EJB3 apparement...)

    merci pour ton aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de persistance avec une relation many-to-one
    Par cb-06 dans le forum Doctrine2
    Réponses: 3
    Dernier message: 28/11/2012, 17h24
  2. Réponses: 2
    Dernier message: 13/07/2012, 16h55
  3. Réponses: 11
    Dernier message: 30/11/2010, 10h44
  4. Problèmes de conversion d'une chaine en double
    Par glycerine dans le forum Débuter
    Réponses: 3
    Dernier message: 31/07/2007, 16h05
  5. [MySQL] Problème avec une double insertion
    Par warmup27 dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 21/10/2006, 00h36

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