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

Java EE Discussion :

Mapping d'une relation bidirectionnelle avec une table de jointure [EJB3]


Sujet :

Java EE

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mai 2012
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Mapping d'une relation bidirectionnelle avec une table de jointure
    Bonjour,

    Pour commencer, voici un extrait de mon schéma de base de donnée:



    Pour chaque table "chevaux", "personnes", "enum_typeRelation", j'ai un EJB Entity (Cheval, Personne, TypeRelation).

    La table enum_typeRelation est comme son nom l'indique, une énumération de relation possible entre une personne et un cheval (ex: gérant, propriétaire,...)

    Les régles métiers sont les suivantes:
    - un cheval peut appartenir à une ou plusieurs personnes
    - un cheval peut être géré par une ou plusieurs personnes
    et la réciproque
    - une personne peut posséder plusieurs chevaux
    - une personne peut gérer plusieurs chevaux
    et bien évidemment une personne peut être à la fois gérante et propriétaire d'un cheval.

    Je cherche à obtenir:
    -à partir d'un cheval, la liste des personnes associés et leurs relations.
    -à partir d'une personne, la liste des chevaux associés et leurs relations.

    C'est mon premier projet avec des EJB, je tâtonne donc en terme de conception et du mapping.
    Je me suis dit que pour arriver à mon objectif je pouvais rajouter dans l'EJB entite TypeRelation deux attributs Cheval et Personne et par la suite mettre une collection de TypeRelation dans chaque EJB Cheval et Personne.
    Classes pour illustrer:

    EJB Cheval
    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
    @Entity
    @Table(name="chevaux")
    public class Cheval implements Serializable {
     
    	/**
             * 
             */
    	private static final long serialVersionUID = 1L;
    	//Déclarations des attributs
    	private int id = 0;
     
    	@Temporal(TemporalType.DATE)
    	@Column(name="datDateNaissance")
    	private Calendar dateNaissance = null;
     
    	private List<TypeRelation> relations = null;
     
     
    	//Constructeur
    	public Cheval() {
    		super();
    	}
     
    	//Getters and Setters
    	@Id
    	@Column(name ="intIdCheval")
    	public int getId() {
    		return id;
    	}
    	public void setId(int id) {
    		this.id = id;
    	}
     
    	public Calendar getDateNaissance() {
    		return dateNaissance;
    	}
    	public void setDateNaissance(Calendar dateNaissance) {
    		this.dateNaissance = dateNaissance;
    	}
     
     
     
     
     
    	@OneToMany
    	@JoinTable(name="ref_chevaux_personnes",
    			joinColumns = @JoinColumn(name="intIdCheval"),
    			inverseJoinColumns = @JoinColumn(name="intIdTypeRelation")
    	)
    	public List<TypeRelation> getRelations() {
    		return relations;
    	}
     
    	public void setRelations(List<TypeRelation> relations) {
    		this.relations = relations;
    	}
    EJB Personne
    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
    @Entity
    @Table(name="personnes")
    public class Personne implements Serializable {
     
    	/**
             * 
             */
    	private static final long serialVersionUID = 1L;
    	//Déclaration attributs
     
    	private int id = 0;
     
    	private List<TypeRelation> relations = null;
     
    	//Constructeur
    	public Personne() {
    		super();
    	}
     
    	//Getters and Setters
    	@Id
    	@Column(name="intIdPersonne")
    	public int getId() {
    		return id;
    	}
     
     
    	public void setId(int id) {
    		this.id = id;
    	}
     
    	@OneToMany
    	@JoinTable(name="ref_chevaux_personnes",
    			joinColumns = @JoinColumn(name="intIdPersonne"),
    			inverseJoinColumns = @JoinColumn(name="intIdTypeRelation")
    	)
    	public List<TypeRelation> getRelations() {
    		return relations;
    	}
     
    	public void setRelations(List<TypeRelation> relations) {
    		this.relations = relations;
    	}
    EJB TypeRelation
    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
    @Entity
    @AttributeOverride( name="id", column = @Column(name="intIdTypeRelation")) 
    @Table(name="enum_relation")
    public class TypeRelation extends DefaultEnumeration {
     
    	/**
             * 
             */
    	private static final long serialVersionUID = 1L;
     
    	private Cheval cheval;
    	private Personne personne;
     
    	public TypeRelation() {
    		// TODO Auto-generated constructor stub
    	}
     
    	public TypeRelation(int id, String libelle) {
    		super(id, libelle);
    		// TODO Auto-generated constructor stub
    	}
     
    	@ManyToOne
    	@JoinTable(name="ref_chevaux_personnes",
    			joinColumns = @JoinColumn(name="intIdCheval", insertable=false, updatable=false)
    			inverseJoinColumns = @JoinColumn(name="intIdPersonne")
    	)
    	public Cheval getCheval() {
    		return cheval;
    	}
     
    	public void setCheval(Cheval cheval) {
    		this.cheval = cheval;
    	}
     
    	@ManyToOne
    	@JoinTable(name="ref_chevaux_personnes",
    			joinColumns = @JoinColumn(name="intIdTypeRelation"),
    			inverseJoinColumns = @JoinColumn(name="intIdPersonne")
    	)
    	public Personne getPersonne() {
    		return personne;
    	}
     
    	public void setPersonne(Personne personne) {
    		this.personne = personne;
    	}
     
     
     
    }
    Ma question est double, en vue de la structure de ma base de donnée (SQL server pour info) est-il possible de mettre en oeuvre mon idée, c'est à dire comment mettre en place une relation bidirectionnelle avec une table de jointure?
    Jugez vous pertinente ma façon de procéder?

    Merci de m'avoir lu et de m'aider à surpasser ce point bloquant.

  2. #2
    Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mai 2012
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Solution
    Bonjour à tous,

    Je vois que ce problème n'en a pas inspiré beaucoup!

    J'ai finalement réussi à obtenir un résultat satisfaisant en rajoutant un ejb supplémentaire.


    L'EJB Relation est une représentation de la table ref_chevaux_personnes
    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
    @Entity
    @Table(name="ref_chevaux_personnes")
    @IdClass(RelationPK.class)
    public class Relation  implements Serializable {
     
    	/**
             * 
             */
    	private static final long serialVersionUID = 1L;
     
    	private Cheval cheval= null;
    	private Personne personne = null;
    	private TypeRelation typeRelation = null;
     
    	public Relation(){
     
    	}
     
    	@Id
    	public Cheval getCheval() {
    		return cheval;
    	}
    	public void setCheval(Cheval cheval) {
    		this.cheval = cheval;
    	}
     
    	@Id
    	public Personne getPersonne() {
    		return personne;
    	}
    	public void setPersonne(Personne personne) {
    		this.personne = personne;
    	}
     
    	@Id
    	public TypeRelation getTypeRelation() {
    		return typeRelation;
    	}
    	public void setTypeRelation(TypeRelation typeRelation) {
    		this.typeRelation = typeRelation;
    	}
    }
    Voici la classe RelationPK @Embeddable qui sert de clé
    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
    @Embeddable
    public class RelationPK implements Serializable {
     
    	/**
             * 
             */
    	private static final long serialVersionUID = 1L;
    	//Déclarations des attributs
    	private Cheval cheval = null;
    	private Personne personne = null;
    	private TypeRelation typeRelation = null;
     
     
    	@Override
    	public boolean equals(Object object) {
    	...
    	}
     
    	@Override
    	public int hashCode() {
    	...
    	}
     
    	//Getters and Setters
    	@ManyToOne
    	@JoinColumn(name="intIdCheval")
    	public Cheval getCheval() {
    		return cheval;
    	}
    	public void setCheval(Cheval cheval) {
    		this.cheval = cheval;
    	}
     
    	@ManyToOne
    	@JoinColumn(name="intIdPersonne")
    	public Personne getPersonne() {
    		return personne;
    	}
    	public void setPersonne(Personne personne) {
    		this.personne = personne;
    	}
     
    	@OneToOne
    	@JoinColumn(name="intIdTypeRelation")
    	public TypeRelation getTypeRelation() {
    		return typeRelation;
    	}
    	public void setTypeRelation(TypeRelation typeRelation) {
    		this.typeRelation = typeRelation;
    	}
    }
    L'EJB TypeRelation se simplifie pour redevenir une simple représentation de la table enum_typeRelation
    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
    @Entity
    @AttributeOverride( name="id", column = @Column(name="intIdTypeRelation")) 
    @Table(name="enum_typeRelation")
    public class TypeRelation extends DefaultEnumeration {
     
    	/**
             * 
             */
    	private static final long serialVersionUID = 1L;
     
    	public TypeRelation() {
    		// TODO Auto-generated constructor stub
    	}
     
    	public TypeRelation(int id, String libelle) {
    		super(id, libelle);
    		// TODO Auto-generated constructor stub
    	}
    }
    Enfin dans les EJB Cheval et Personne, on supprime la liste de TypeRelation pour la remplacer par une liste de Relation

    EJB Personne
    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
    @Entity
    @Table(name="personnes")
    public class Personne implements Serializable {
     
    	/**
             * 
             */
    	private static final long serialVersionUID = 1L;
    	//Déclaration attributs
    private List<Relation> relations = null;
     
    	...
     
    	@OneToMany(mappedBy="personne")
    	public List<Relation> getRelations() {
    		return relations;
    	}
     
    	public void setRelations(List<Relation> relations) {
    		this.relations = relations;
    	}
    }
    Evidement dans l'EJB Cheval, mappedBy prend "cheval" comme valeur.

    L'accès par défaut aux collections dans mes ejb est en fetch= LAZY, il faut donc penser à créer un ejb session qui permet de récupérer les données
    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    @Remote
    @Stateless
    public class GestionPersonneEJB implements GestionPersonne {
     
    	@Override
    	public List<Relation> listerRelations(int idPersonne) {
    		List<Relation> lst;
    		lst=em.find(Personne.class, idPersonne).getRelations();
    		lst.isEmpty();
    		return lst;
    	}
    }
    Voilà, cette solution de mapping fonctionne (du moins sur la récupération, je n'ai pas encore testé l'ajout ou la modification). Mes connaissances sur l'implémentation d'EJB et leurs mapping avec une base de données sont encore très limitées. Ce qui me fait penser qu'il doit exister d'autres solutions plus simples et efficaces.

    Aussi, bien que résolu, la solution reste ouverte à la critique.

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

Discussions similaires

  1. Calcul avec une valeur issue d'une relation
    Par malumiere dans le forum W4 Express
    Réponses: 5
    Dernier message: 16/05/2012, 12h58
  2. création de Table avec une relation
    Par Sim0799 dans le forum Modélisation
    Réponses: 1
    Dernier message: 06/02/2010, 13h03
  3. Réponses: 3
    Dernier message: 25/06/2008, 15h21
  4. Réponses: 18
    Dernier message: 26/11/2007, 15h43
  5. Pb avec une relation entre table
    Par stephane77fr dans le forum Windows Forms
    Réponses: 3
    Dernier message: 17/08/2007, 16h28

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