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 :

Problème de modelisation d'un mapping de base


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juillet 2002
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 66
    Par défaut Problème de modelisation d'un mapping de base
    Bonjour à tous,

    Je ne suis pas sur d'être sur le bon forum car ma requête touche à la fois hibernate dans l'absolu mais que j'applique en utilisant jpa ... bref

    Je n'arrive pas à choisir la bonne solution pour venir me brancher sur un modèle de base existant. J'ai un début de mapping mais je ne sais pas si je vais dans le bon sens.

    Mon modèle est le suivant :

    Je dispose de 3 tables :

    - Une table contact : informations sur une personne
    - Table mail : différents mail d'une personne
    - Table typemail : Définie le type de mail (perso, pro ...) : l'id de cette table est par exemple : P pour perso. C'est donc une liste des types dispo

    une table d'association est liée à ces 3 tables, la clé primaire de cette table est l'agrégation des 3 clés primaires des autres table (contact, mail, typemail).

    J'ai donc (je simplifie le contenu) :

    contact : id_contact
    mail : id_mail
    mailtype : id_type

    table d'asso : contact_mail : id_contact + id_mail + id_type

    Un enregistrement de la table d'asso peut donc avoir cette forme :

    id_contact : 100001
    id_mail : 123456
    id_type : P

    Pour le moment mon mapping est le suivant :

    Contact :
    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
     
    @Entity
    @Table(schema = "COMMON", name = "COM_CONTACT")
    @NamedQueries(
    	{
    		@NamedQuery(name="Contact.findById", query="select c from Contact c where c.id = :id")
    	}
    )
    public class Contact {
     
    	@Id 
    	//@GeneratedValue(generator="triggerAssigned")
    	//@GenericGenerator(name="triggerAssigned",
    	//		  strategy = "com.edhec.usrmgt.orm.hibernate.util.TriggerAssignedIdentityGenerator"
    	//		)
    	//@Column(name = "ID",length = 20, unique=false, nullable=false)
    	protected String id;
     
    	@Column(name = "NAME",length = 250, unique=false, nullable=false)
    	protected String name;
     
    	@Column(name = "INTERNAL_REFERENCE",length = 50, unique=false, nullable=true)
    	protected String internalReference;
     
    	@Column(name = "LOGIN",length = 250, unique=true, nullable=true)
    	protected String login;
     
    	@Column(name = "PASSWORD",length = 250, unique=false, nullable=true)
    	protected String password;
     
    	@Column(name = "WEB_CODE",length = 250, unique=true, nullable=true)
    	protected String webCode;
     
    	@Column(name = "DATE_CREATED", length = 30, unique=false, nullable=true)
    	protected String dateCreated;
     
    	@Column(name = "DATE_MODIFIED", length = 30, unique=false, nullable=true)
    	protected String dateModified;
     
    	@ManyToMany(
    			fetch=FetchType.EAGER,
    	        targetEntity=ComMail.class,
    	        cascade={CascadeType.PERSIST, CascadeType.MERGE}
    	    )
    	    @JoinTable(
    	        name="COM_CONTACT_MAIL",
    	        joinColumns=@JoinColumn(name="CNT_ID"),
    	        inverseJoinColumns=@JoinColumn(name="MAL_ID")
    	    )
    	protected Collection<ComMail> mail;
     
    	public Contact() {
     
    	}
     
    	public String getId() {
    		return id;
    	}
     
    	public void setId(String id) {
    		this.id = id;
    	}
     
    	public String getName() {
    		return name;
    	}
     
    	public void setName(String name) {
    		this.name = name;
    	}
     
    	public String getInternalReference() {
    		return internalReference;
    	}
     
    	public void setInternalReference(String internalReference) {
    		this.internalReference = internalReference;
    	}
     
    	public String getLogin() {
    		return login;
    	}
     
    	public void setLogin(String login) {
    		this.login = login;
    	}
     
    	public String getPassword() {
    		return password;
    	}
     
    	public void setPassword(String password) {
    		this.password = password;
    	}
     
    	public String getWebCode() {
    		return webCode;
    	}
     
    	public void setWebCode(String webCode) {
    		this.webCode = webCode;
    	}
     
    	public String getDateCreated() {
    		return dateCreated;
    	}
     
    	public void setDateCreated(String dateCreated) {
    		this.dateCreated = dateCreated;
    	}
     
    	public String getDateModified() {
    		return dateModified;
    	}
     
    	public void setDateModified(String dateModified) {
    		this.dateModified = dateModified;
    	}
     
     
     
    	public Collection<ComMail> getMail() {
    		return mail;
    	}
     
    	public void setMail(Collection<ComMail> mail) {
    		this.mail = mail;
    	}
     
    }
    Mail :

    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
     
    @Entity
    @Table(schema = "COMMON", name = "COM_MAIL")
    @NamedQuery(name="ComMail.findById", query="select c from ComMail c where c.id = :id")
    public class ComMail {
     
    	@Id
    	@GeneratedValue(strategy = GenerationType.AUTO)
    	protected String id;
     
    	@Column(name = "MAIL",length = 250, unique=true, nullable=true)
    	protected String mail;
     
    	@Column(name = "URL",length = 250, unique=false, nullable=true)
    	protected String url;
     
    	@Column(name = "DATE_CREATED",length = 250, unique=true, nullable=true)
    	protected String dateCreated;
     
    	@Column(name = "DATE_MODIFIED",length = 250, unique=true, nullable=true)
    	protected String dateModified;
     
    	@ManyToMany(mappedBy = "mail")
    	@JoinColumn(name="MAL_ID")
    	protected Collection<Contact> contact;
     
    	@OneToOne(
    		fetch=FetchType.EAGER,
            targetEntity=ComAdressKind.class,
            cascade={CascadeType.PERSIST, CascadeType.MERGE}
        )
        @JoinTable(
            name="COM_CONTACT_MAIL",
            joinColumns=@JoinColumn(name="MAL_ID"),
            inverseJoinColumns=@JoinColumn(name="AKD_ID")
        )
    	protected ComAdressKind adressKind;
     
    	public String getId() {
    		return id;
    	}
     
    	public void setId(String id) {
    		this.id = id;
    	}
     
    	public String getMail() {
    		return mail;
    	}
     
    	public void setMail(String mail) {
    		this.mail = mail;
    	}
     
    	public String getUrl() {
    		return url;
    	}
     
    	public void setUrl(String url) {
    		this.url = url;
    	}
     
    	public String getDateCreated() {
    		return dateCreated;
    	}
     
    	public void setDateCreated(String dateCreated) {
    		this.dateCreated = dateCreated;
    	}
     
    	public String getDateModified() {
    		return dateModified;
    	}
     
    	public void setDateModified(String dateModified) {
    		this.dateModified = dateModified;
    	}
     
     	@ManyToMany(mappedBy = "mail")
     	@JoinColumn(name="MAL_ID")
    	public Collection<Contact> getContact() {
    		return contact;
    	}
     
    	public void setContact(Collection<Contact> contact) {
    		this.contact = contact;
    	}
     
    	public ComAdressKind getAdressKind() {
    		return adressKind;
    	}
     
    	public void setAdressKind(ComAdressKind adressKind) {
    		this.adressKind = adressKind;
    	}
    }
    TypeMail :

    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
    @Entity
    @Table(schema = "COMMON", name = "COM_ADRESS_KIND")
    @NamedQuery(name="ComAdressKind.findById", query="select c from ComAdressKind c where c.id = :id")
    public class ComAdressKind {
     
    	@Id
    	@GeneratedValue(strategy = GenerationType.AUTO)
    	protected String id;
     
    	@Column(name = "DATE_CREATED",length = 30, unique=false, nullable=true)
    	protected String dateCreated;
     
    	@Column(name = "DATE_MODIFIED",length = 30, unique=false, nullable=true)
    	protected String dateModified;
     
    	@OneToOne(mappedBy = "adressKind")
    	protected ComMail mail;
     
    	public String getId() {
    		return id;
    	}
     
    	public void setId(String id) {
    		this.id = id;
    	}
     
    	public String getDateCreated() {
    		return dateCreated;
    	}
     
    	public void setDateCreated(String dateCreated) {
    		this.dateCreated = dateCreated;
    	}
     
    	public String getDateModified() {
    		return dateModified;
    	}
     
    	public void setDateModified(String dateModified) {
    		this.dateModified = dateModified;
    	}
     
    	public ComMail getMail() {
    		return mail;
    	}
     
    	public void setMail(ComMail mail) {
    		this.mail = mail;
    	}
    }
    J'ai donc mon contact qui dispose d'une liste de mail. Chaque mail est lié à un type.

    Dans cette configuration, le système n'arrive pas à récupérer le type de mail.

    L'association contact / mail fonctionne correctement.

    J'avais également pensé créer un objet pour ma table d'asso pour éventuellement simplifié mais je trouve que ce n'est pas très bien.

    J'espère avoir été assez explicite (et pas trop chiant ).

    Quelqu'un aurait une idée pour résoudre cette problèmatique ?

    Merci

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 100
    Par défaut
    Quand 2 tables sont liées par une table d'association, on n'a pas besoin de mapper cette table d'association. On a simplement une relation many-to-many entre les deux classes.

    Mais ici, on doit mapper la table d'association parce qu'elle relie 3 tables.

    Cependant je ne suis pas sûr que ton modèle de données corresponde à ce que tu souhaite faire. Si j'ai bien compris tu voudrais qu'un contact puisse posséder plusieurs mails. Si c'est le cas ton modèle serait plutôt :
    - une table contact (id_contact)
    - une table type de mail (id_type_mail)
    - une table mail (id_mail) avec les clé étrangères "id_contact" et "id_type_mail"

  3. #3
    Membre confirmé
    Inscrit en
    Juillet 2002
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 66
    Par défaut
    Hello,

    merci pour ta réponse, c'est effectivement ce que j'ai actuellement.

    Une classe contact qui possede une many-to-many vers mail.

    Ensuite ma classe mail comprends une relation many-to-one vers la classe typeMail.

    Pour le moment je n'ai pas mappé ma table d'asso.

    En fait elle regroupe les 3 clés : id_contact, id_mail et id_typemail.

    Mais j'ai 'splitté' dans mon code en utilisant d'une part la relation id_contact et id_mail (la relation many-to-many) et d'autre part la relation id_mail avec id_typemail (la relation many-to-one).

    La 1ere fonctionne : je récupère la liste des mail d'un contact.
    Par contre lorsque un objet mail essaye d'aller chercher son type, il me dit qu'il ne trouve rien (j'obtiens une erreur).

    Je pense que je peux m'en sortir de cette facon, ca me semble logique.

    Mais je ne suis pas sur de mes relations.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 100
    Par défaut
    Je n'arrive pas à comprendre quel est ton schéma.

    Est-ce :
    1)

    contact
    |
    V
    asso <-- mail
    ^
    |
    type

    ou 2)

    contact <-- mail --> type


    Désolé si mes flèches ne sont pas faciles à lire...

    Pour moi c'est le 2) qu'il faut faire, et il n'y a pas de relation many-to-many, car il n'y a pas de table d'association.
    Mais simplement des relations many-to-one et one-to-many

  5. #5
    Membre confirmé
    Inscrit en
    Juillet 2002
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 66
    Par défaut
    Alors je vais essayer de modeliser les tables

    ---------- ------------- ----------
    |Contact |Asso: | |Mail : |
    |id | -> |id_contact | | id |
    |nom | |id_mail | <- |mail |
    |prenom | |id_typemail | | |
    ----------- -------------- ---------
    /\
    |
    -------------
    |TypeMail: |
    |id |
    |Translation|
    | |
    -----------

    Avec la clé primaire d'asso qui est le regroupement des 3 id.

    Ce qui fait que l'unicité est pour 1 contact 1 mail d'un type précis.

    le many-to-many existe entre contact et mail car un contact peut posseder plusieurs mails et 1 mail peut être relié à plusieurs contact.

    Normalement un mail n'est jamais relié à plusieurs contacts. C'est les personnes qui ont à l'époque fait ce modèle qui l'ont décidés ainsi ...

    Donc effectivement j'ai fais comme tu me conseilles.

    J'ai un contact qui dispose de 1 ou plusieurs mails.

    1 mail est relié à un type.

    J'arrive donc à récupérer depuis mon contact, sa liste de mails avec leur type respectif.

    Je n'ai mis aucune contrainte pour le moment, je ne suis pas sur que l'unicité des 3 clés soient vérifiée.

    J'espère que ca a pu t'éclairer.

    PS : désolé pour l'affichage du pseudo schéma, mais en publiant il me vire les espaces ...

  6. #6
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Dans l'absolu, un mail est soit personnel, soit professionnel.
    Donc, je ne vois pas trop l'intérêt de la table type, ce serait plutôt un attribut de mail, mais bon, admettons que tu veuilles pouvoir ajouter d'autres types, il n'en demeure pas moins que ça reste un attribut de mail, pas de l'association entre contact et mail.
    Tu pourrais envisager une relation many-to-one entre mail et type, non ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. Problème de récupération dans une map
    Par sacdenoeud dans le forum C++
    Réponses: 7
    Dernier message: 26/03/2006, 09h40
  2. [SQL-Server] problème d'affichage des caratères lus en base
    Par Invité dans le forum PHP & Base de données
    Réponses: 19
    Dernier message: 31/01/2006, 15h05
  3. [MCD]Modeliser Table externe à la base de données
    Par bossun dans le forum Schéma
    Réponses: 4
    Dernier message: 27/06/2005, 16h43
  4. Problème de suppression de ligne dans ma base !
    Par gregman dans le forum ASP
    Réponses: 2
    Dernier message: 21/05/2005, 09h14
  5. Problémes mémoire avec le bde sur des bases paradox
    Par Keke des Iles dans le forum Bases de données
    Réponses: 2
    Dernier message: 27/05/2004, 17h55

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