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 :

[JPA][EJB3] The @JoinColumns on the annotated element


Sujet :

JPA Java

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 189
    Points : 2 336
    Points
    2 336
    Par défaut [JPA][EJB3] The @JoinColumns on the annotated element
    Hello,

    J'ai un petit soucies avec des clefs primaires composés et l'utilisation depuis une Entity qui possède une relation étrangère.

    Voici mon message d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    The @JoinColumns on the annotated element [private com.ejb.entity.core.Message com.ejb.entity.core.Country.message] from the entity class [class com.ejb.entity.core.Country] is incomplete. When the source entity class uses a composite primary key, a @JoinColumn must be specified for each join column using the @JoinColumns. Both the name and the referenceColumnName elements must be specified in each such @JoinColumn.
    Voici la structure de mes tables incriminées :

    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
     
    DROP TABLE IF EXISTS `message`;
    CREATE TABLE `message` (
      `id_message` int NOT NULL,
      `text` text NOT NULL,
      `ref_type` int(4) NOT NULL,
      `ref_lang` int(2) NOT NULL,  
      FOREIGN KEY `FK_MESSAGE_TYPE` (`ref_type`) REFERENCES `type` (`id_type`),
      PRIMARY KEY  (`id_message`,`ref_lang`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
     
    DROP TABLE IF EXISTS `country`;
    CREATE TABLE `country` (
      `id_country` int(11) NOT NULL,
      `ref_message` int(4) NOT NULL,
      `country_code` char(2) NOT NULL,
      PRIMARY KEY  (`id_country`,`ref_message`),
      FOREIGN KEY `FK_country_MESSAGE` (`ref_message`)  REFERENCES `message` (`id_message`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    La clef primaire de message est donc définit par id_message et ref_lang

    Les EJB donnes donc, pour message :

    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
     
    package com.ejb.entity.core;
     
    import java.io.Serializable;
    import java.util.Collection;
    import javax.persistence.CascadeType;
    import javax.persistence.Column;
    import javax.persistence.EmbeddedId;
    import javax.persistence.Entity;
    import javax.persistence.JoinColumn;
    import javax.persistence.Lob;
    import javax.persistence.ManyToOne;
    import javax.persistence.NamedQueries;
    import javax.persistence.NamedQuery;
    import javax.persistence.OneToMany;
    import javax.persistence.Table;
     
    /**
     * Entity class Message
     * 
     * @author alex
     */
    @Entity
    @Table(name = "message")
    @NamedQueries( {
            @NamedQuery(name = "Message.findByIdMessage", query = "SELECT m FROM Message m WHERE m.messagePK.idMessage = :idMessage"),
            @NamedQuery(name = "Message.findByLang", query = "SELECT m FROM Message m WHERE m.messagePK.lang = :lang")
        })
    public class Message implements Serializable {
     
        /**
         * EmbeddedId primary key field
         */
        @EmbeddedId
        protected MessagePK messagePK;
     
        @Lob
        @Column(name = "text", nullable = false)
        private String text;
     
        @OneToMany(cascade = CascadeType.ALL, mappedBy = "message")
        private Collection<Month> monthCollection;
     
        @OneToMany(cascade = CascadeType.ALL, mappedBy = "message")
        private Collection<Country> countryCollection;
     
        @JoinColumn(name = "ref_type", referencedColumnName = "id_type")
        @ManyToOne
        private Type refType;
     
        @OneToMany(cascade = CascadeType.ALL, mappedBy = "message")
        private Collection<Category> categoryCollection;
     
        /** Creates a new instance of Message */
        public Message() {
        }
     
        /**
         * Creates a new instance of Message with the specified values.
         * @param messagePK the messagePK of the Message
         */
        public Message(MessagePK messagePK) {
            this.messagePK = messagePK;
        }
     
        /**
         * Creates a new instance of Message with the specified values.
         * @param messagePK the messagePK of the Message
         * @param text the text of the Message
         */
        public Message(MessagePK messagePK, String text) {
            this.messagePK = messagePK;
            this.text = text;
        }
     
        /**
         * Creates a new instance of MessagePK with the specified values.
         * @param lang the lang of the MessagePK
         * @param idMessage the idMessage of the MessagePK
         */
        public Message(int lang, int idMessage) {
            this.messagePK = new MessagePK(lang, idMessage);
        }
     
        /**
         * Gets the messagePK of this Message.
         * @return the messagePK
         */
        public MessagePK getMessagePK() {
            return this.messagePK;
        }
     
        /**
         * Sets the messagePK of this Message to the specified value.
         * @param messagePK the new messagePK
         */
        public void setMessagePK(MessagePK messagePK) {
            this.messagePK = messagePK;
        }
     
        /**
         * Gets the text of this Message.
         * @return the text
         */
        public String getText() {
            return this.text;
        }
     
        /**
         * Sets the text of this Message to the specified value.
         * @param text the new text
         */
        public void setText(String text) {
            this.text = text;
        }
     
        /**
         * Gets the monthCollection of this Message.
         * @return the monthCollection
         */
        public Collection<Month> getMonthCollection() {
            return this.monthCollection;
        }
     
        /**
         * Sets the monthCollection of this Message to the specified value.
         * @param monthCollection the new monthCollection
         */
        public void setMonthCollection(Collection<Month> monthCollection) {
            this.monthCollection = monthCollection;
        }
     
        /**
         * Gets the countryCollection of this Message.
         * @return the countryCollection
         */
        public Collection<Country> getCountryCollection() {
            return this.countryCollection;
        }
     
        /**
         * Sets the countryCollection of this Message to the specified value.
         * @param countryCollection the new countryCollection
         */
        public void setCountryCollection(Collection<Country> countryCollection) {
            this.countryCollection = countryCollection;
        }
     
        /**
         * Gets the refType of this Message.
         * @return the refType
         */
        public Type getRefType() {
            return this.refType;
        }
     
        /**
         * Sets the refType of this Message to the specified value.
         * @param refType the new refType
         */
        public void setRefType(Type refType) {
            this.refType = refType;
        }
     
        /**
         * Gets the categoryCollection of this Message.
         * @return the categoryCollection
         */
        public Collection<Category> getCategoryCollection() {
            return this.categoryCollection;
        }
     
        /**
         * Sets the categoryCollection of this Message to the specified value.
         * @param categoryCollection the new categoryCollection
         */
        public void setCategoryCollection(Collection<Category> categoryCollection) {
            this.categoryCollection = categoryCollection;
        }
     
        /**
         * Returns a hash code value for the object.  This implementation computes 
         * a hash code value based on the id fields in this object.
         * @return a hash code value for this object.
         */
        @Override
        public int hashCode() {
            int hash = 0;
            hash += (this.messagePK != null ? this.messagePK.hashCode() : 0);
            return hash;
        }
     
        /**
         * Determines whether another object is equal to this Message.  The result is 
         * <code>true</code> if and only if the argument is not null and is a Message object that 
         * has the same id field values as this object.
         * @param object the reference object with which to compare
         * @return <code>true</code> if this object is the same as the argument;
         * <code>false</code> otherwise.
         */
        @Override
        public boolean equals(Object object) {
            // TODO: Warning - this method won't work in the case the id fields are not set
            if (!(object instanceof Message)) {
                return false;
            }
            Message other = (Message)object;
            if (this.messagePK != other.messagePK && (this.messagePK == null || !this.messagePK.equals(other.messagePK))) return false;
            return true;
        }
     
        /**
         * Returns a string representation of the object.  This implementation constructs 
         * that representation based on the id fields.
         * @return a string representation of the object.
         */
        @Override
        public String toString() {
            return "com.ejb.entity.core.Message[messagePK=" + messagePK + "]";
        }
     
    }
    Et pour Country :

    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
     
    package com.ejb.entity.core;
     
    import java.io.Serializable;
    import javax.persistence.Column;
    import javax.persistence.EmbeddedId;
    import javax.persistence.Entity;
    import javax.persistence.JoinColumn;
    import javax.persistence.ManyToOne;
    import javax.persistence.NamedQueries;
    import javax.persistence.NamedQuery;
    import javax.persistence.Table;
     
    /**
     * Entity class Country
     * 
     * @author alex
     */
    @Entity
    @Table(name = "country")
    @NamedQueries( {
            @NamedQuery(name = "Country.findByIdCountry", query = "SELECT c FROM Country c WHERE c.countryPK.idCountry = :idCountry"),
            @NamedQuery(name = "Country.findByRefMessage", query = "SELECT c FROM Country c WHERE c.countryPK.refMessage = :refMessage"),
            @NamedQuery(name = "Country.findByCountryCode", query = "SELECT c FROM Country c WHERE c.countryCode = :countryCode")
        })
    public class Country implements Serializable {
     
        /**
         * EmbeddedId primary key field
         */
        @EmbeddedId
        protected CountryPK countryPK;
     
        @Column(name = "country_code", nullable = false)
        private String countryCode;
     
        @JoinColumn(name = "ref_message", referencedColumnName = "id_message", insertable = false, updatable = false)
        @ManyToOne
        private Message message;
     
        /** Creates a new instance of Country */
        public Country() {
        }
     
        /**
         * Creates a new instance of Country with the specified values.
         * @param countryPK the countryPK of the Country
         */
        public Country(CountryPK countryPK) {
            this.countryPK = countryPK;
        }
     
        /**
         * Creates a new instance of Country with the specified values.
         * @param countryPK the countryPK of the Country
         * @param countryCode the countryCode of the Country
         */
        public Country(CountryPK countryPK, String countryCode) {
            this.countryPK = countryPK;
            this.countryCode = countryCode;
        }
     
        /**
         * Creates a new instance of CountryPK with the specified values.
         * @param refMessage the refMessage of the CountryPK
         * @param idCountry the idCountry of the CountryPK
         */
        public Country(int refMessage, int idCountry) {
            this.countryPK = new CountryPK(refMessage, idCountry);
        }
     
        /**
         * Gets the countryPK of this Country.
         * @return the countryPK
         */
        public CountryPK getCountryPK() {
            return this.countryPK;
        }
     
        /**
         * Sets the countryPK of this Country to the specified value.
         * @param countryPK the new countryPK
         */
        public void setCountryPK(CountryPK countryPK) {
            this.countryPK = countryPK;
        }
     
        /**
         * Gets the countryCode of this Country.
         * @return the countryCode
         */
        public String getCountryCode() {
            return this.countryCode;
        }
     
        /**
         * Sets the countryCode of this Country to the specified value.
         * @param countryCode the new countryCode
         */
        public void setCountryCode(String countryCode) {
            this.countryCode = countryCode;
        }
     
        /**
         * Gets the message of this Country.
         * @return the message
         */
        public Message getMessage() {
            return this.message;
        }
     
        /**
         * Sets the message of this Country to the specified value.
         * @param message the new message
         */
        public void setMessage(Message message) {
            this.message = message;
        }
     
        /**
         * Returns a hash code value for the object.  This implementation computes 
         * a hash code value based on the id fields in this object.
         * @return a hash code value for this object.
         */
        @Override
        public int hashCode() {
            int hash = 0;
            hash += (this.countryPK != null ? this.countryPK.hashCode() : 0);
            return hash;
        }
     
        /**
         * Determines whether another object is equal to this Country.  The result is 
         * <code>true</code> if and only if the argument is not null and is a Country object that 
         * has the same id field values as this object.
         * @param object the reference object with which to compare
         * @return <code>true</code> if this object is the same as the argument;
         * <code>false</code> otherwise.
         */
        @Override
        public boolean equals(Object object) {
            // TODO: Warning - this method won't work in the case the id fields are not set
            if (!(object instanceof Country)) {
                return false;
            }
            Country other = (Country)object;
            if (this.countryPK != other.countryPK && (this.countryPK == null || !this.countryPK.equals(other.countryPK))) return false;
            return true;
        }
     
        /**
         * Returns a string representation of the object.  This implementation constructs 
         * that representation based on the id fields.
         * @return a string representation of the object.
         */
        @Override
        public String toString() {
            return "com.ejb.entity.core.Country[countryPK=" + countryPK + "]";
        }
     
    }
    Si je comprend bien la partie

    com.ejb.entity.core.Message com.ejb.entity.core.Country.message] from the entity class [class com.ejb.entity.core.Country] is incomplete.
    Cela signifie donc que je devrais non plus définir mon join de cette manière
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        @JoinColumn(name = "ref_message", referencedColumnName = "", insertable = false, updatable = false)
        @ManyToOne
    mais de cette manière

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      @JoinColumns({
            @JoinColumn(name="ref_message", referencedColumnName="id_message"),
            @JoinColumn(name="ref_lang", referencedColumnName="ref_lang")
        })
    J'arrive enfin au problème : Je ne possède pas dans mon Entité Coutry de champ ref_lang.

    Comment faire :/

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 189
    Points : 2 336
    Points
    2 336
    Par défaut
    La seule solution que je vois est de supprimer la relation et de mettre un refMessage en int

    j aurais bien aimer trouvé une solution plus élégante pour ne pas perdre mon objet

  3. #3
    Membre actif Avatar de a.snaps
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    209
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 209
    Points : 241
    Points
    241
    Par défaut
    Je suis pas sûr de comprendre... Mais voici un shot:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    @Entity
    public class Truc
    {
        @OneToOne
        @JoinColumns({@JoinColumn(name="MACHIN1_ID"), @JoinColumn(name="MACHIN2_ID")})
        Machin chose; // composite PK
        ...
    }
    Mais si un Machin est représenté par 2 champs, tu devras avoir deux champs comme foreign key dans les tables référentes (ici: MACHIN1_ID et MACHIN2_ID), c'est bien ça?!

    Alex

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 189
    Points : 2 336
    Points
    2 336
    Par défaut
    En effet machin est composé de machinPK et truc ne comporte pas de colonne
    machinPK.ref_bidulle

    Pour être plus clair,

    une classe Message comporte une clef primaine MessagePK composé de son id et d'une référence sur une lang donc un Lang refLang.

    une classe Country comporte un message

    (exemple)

    country

    id_country = 1
    ref_message = 1

    message
    id_message = 1
    ref_lang = 1
    text = "Suisse"

    id_message = 1
    ref_lang = 2
    text = "Schweiz"

    id_message = 1
    ref_lang = 3
    text = "Switzerland"

  5. #5
    Membre habitué Avatar de xv-mnt
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2005
    Messages : 142
    Points : 178
    Points
    178
    Par défaut
    Il me semble que ta structure DB est incomplète, puisque ta FK [ref_message] référence seulement une partie de la PK de Message [id_message], au lieu de [id_message, reg_lang]. C'est étrange que ta DB accepte ceci mais je ne connais pas comment MySQL marche ; donc je ne peux pas juger. A priori d'autres DB refusent ce genre de déclaration incorrecte (ORACLE c'est sûr).
    Peux-tu changer la deuxième table pour avoir une structure correcte ? Ainsi, JPA devrait pouvoir passer.
    Tout le monde savait que c'était impossible à faire. Puis un jour quelqu'un est arrivé qui ne le savait pas, et il le fit (Winston Churchill)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 189
    Points : 2 336
    Points
    2 336
    Par défaut
    hm.je vais testé ca

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 189
    Points : 2 336
    Points
    2 336
    Par défaut
    A premiere vue MySQL n'accepte pas


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    DROP TABLE IF EXISTS `country`;
    CREATE TABLE `country` (
      `id_country` int(11) NOT NULL,
      `ref_message` int(4) NOT NULL,
      `country_code` char(2) NOT NULL,
      PRIMARY KEY  (`id_country`,`ref_message`),
      FOREIGN KEY `FK_country_MESSAGE` (`ref_message`)  REFERENCES `message` (`id_message,`ref_lang`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    message d'erreur can't create table country rien de plus

  8. #8
    Membre actif Avatar de a.snaps
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    209
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 209
    Points : 241
    Points
    241
    Par défaut
    Citation Envoyé par *alexandre*
    A premiere vue MySQL n'accepte pas


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    DROP TABLE IF EXISTS `country`;
    CREATE TABLE `country` (
      `id_country` int(11) NOT NULL,
      `ref_message` int(4) NOT NULL,
      `country_code` char(2) NOT NULL,
      PRIMARY KEY  (`id_country`,`ref_message`),
      FOREIGN KEY `FK_country_MESSAGE` (`ref_message`)  REFERENCES `message` (`id_message,`ref_lang`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    message d'erreur can't create table country rien de plus
    Bien sûr que non!
    Une colonne ne peux pas en référencé deux (bon ok, pas complètement vrai, mais sûrement pour MySQL )
    Alex

  9. #9
    Membre actif Avatar de a.snaps
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    209
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 209
    Points : 241
    Points
    241
    Par défaut
    Citation Envoyé par *alexandre*
    En effet machin est composé de machinPK et truc ne comporte pas de colonne
    machinPK.ref_bidulle

    Pour être plus clair,

    une classe Message comporte une clef primaine MessagePK composé de son id et d'une référence sur une lang donc un Lang refLang.

    une classe Country comporte un message

    (exemple)

    country

    id_country = 1
    ref_message = 1

    message
    id_message = 1
    ref_lang = 1
    text = "Suisse"

    id_message = 1
    ref_lang = 2
    text = "Schweiz"

    id_message = 1
    ref_lang = 3
    text = "Switzerland"
    Je suis d'accord avec xv-mnt, tu essaies de faire un mapping qui est déjà incomplet au niveau DB! Je pense que tu dois un peux revoir le tout...
    Alex

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 189
    Points : 2 336
    Points
    2 336
    Par défaut
    C'est ce que je fais, je réécris le script pour oracle (et corrige). Pas envie de perdre mes objets et de refaire des getMachin(int id).

Discussions similaires

  1. Specified element is already the logical child of another element. Disconnect it first.
    Par richton95 dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 26/12/2012, 08h20
  2. Réponses: 1
    Dernier message: 22/04/2010, 12h24
  3. Réponses: 4
    Dernier message: 15/02/2007, 10h06
  4. placing footer on the bottom of the region-area
    Par bdegeratu dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 05/08/2005, 07h55
  5. Ghost in the shell in the PC
    Par inertia dans le forum MFC
    Réponses: 3
    Dernier message: 11/07/2005, 15h33

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