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 :

Table de jointure avec colonne suplémentaire


Sujet :

JPA Java

  1. #1
    Membre éclairé Avatar de scandinave
    Homme Profil pro
    Développeur Java, NodeJs/Angular
    Inscrit en
    Mai 2009
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Java, NodeJs/Angular

    Informations forums :
    Inscription : Mai 2009
    Messages : 277
    Par défaut Table de jointure avec colonne suplémentaire
    Bonjour, cela fait plusieurs jour que je sèche sur le problème.
    J'ai 2 tables. Autorisation et Role
    Un lien ManyToMany entre les deux.

    Jusque l'a pas de problème. Seulement je voudrais ajouter la colonne "droit" qui est un boolean dans la table de jointure autorisation_role.

    J'ai essayé de créer l'entity AutorisationRole mais JPA refuse de me créer les tables. Quelqu'un pourrais-t-il me donner le code pour faire cela avec ces trois tables?

  2. #2
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 938
    Par défaut
    Bonjour,

    En général quand il y'a des colonnes supplémentaires que l'on veut rajouter à une table d'association,je préfère perso gérer moi même le mapping de cette table,en clair voila ce qui va changer :
    -J'aurai 3 entités (Autorisation,Role,AutorisationRole)
    -J'aurai non plus de ManyToMany mais un OneToMany entre Autorisation et AutorisationRole, et ensuite un OneToMany aussi entre Role et AutorisationRole
    -Je pourrais donc dans ce cas rajouter autant de colonnes personnalisées qu'il n'est nécessaire dans cette table d'association.
    L'inconvenient de cette méthode c'est que c'est toi qui devras programmatiquement la persistance des données dans cette table d'association.donc créer une entité d'AutorisationRole, il faudra d'abord que les entités Role et Autorisation existent.Voila c'est pas compliqué

  3. #3
    Membre éclairé Avatar de scandinave
    Homme Profil pro
    Développeur Java, NodeJs/Angular
    Inscrit en
    Mai 2009
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Java, NodeJs/Angular

    Informations forums :
    Inscription : Mai 2009
    Messages : 277
    Par défaut
    merci pour ta réponse, je vais tester ça demain, je te tiens au courant

  4. #4
    Membre éclairé Avatar de scandinave
    Homme Profil pro
    Développeur Java, NodeJs/Angular
    Inscrit en
    Mai 2009
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Java, NodeJs/Angular

    Informations forums :
    Inscription : Mai 2009
    Messages : 277
    Par défaut
    Alors j'ai essayé de faire comme tu me la dit. Cependant impossible de compiler.
    J'ai l'erreur suivante et je ne sais pas pourquoi?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Caused by: Exception [EclipseLink-7298] (Eclipse Persistence Services - 2.0.1.v20100213-r6600): org.eclipse.persistence.exceptions.ValidationException
    Exception Description: The mapping [autorisation] from the embedded ID class [class model.catalog.AutorisationRoleId] is an invalid mapping for this class. An embeddable class that is used with an embedded ID specification (attribute [autorisationRoleId] from the source [class model.catalog.AutorisationRole]) can only contain basic mappings. Either remove the non basic mapping or change the embedded ID specification on the source to be embedded.
    	at org.eclipse.persistence.exceptions.ValidationException.invalidMappingForEmbeddedId(ValidationException.java:1249)
    	at org.eclipse.persistence.internal.jpa.metadata.accessors.mappings.EmbeddedIdAccessor.process(EmbeddedIdAccessor.java:141)
    	at org.eclipse.persistence.internal.jpa.metadata.MetadataDescriptor.processAccessors(MetadataDescriptor.java:1269)
    	at org.eclipse.persistence.internal.jpa.metadata.accessors.classes.ClassAccessor.processAccessors(ClassAccessor.java:825)
    	at org.eclipse.persistence.internal.jpa.metadata.accessors.classes.EntityAccessor.processAccessors(EntityAccessor.java:847)
    	at org.eclipse.persistence.internal.jpa.metadata.accessors.classes.EntityAccessor.process(EntityAccessor.java:708)
    	at org.eclipse.persistence.internal.jpa.metadata.MetadataProject.processStage2(MetadataProject.java:1333)
    	at org.eclipse.persistence.internal.jpa.metadata.MetadataProcessor.processORMMetadata(MetadataProcessor.java:461)
    	at org.eclipse.persistence.internal.jpa.deployment.PersistenceUnitProcessor.processORMetadata(PersistenceUnitProcessor.java:390)
    	at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.predeploy(EntityManagerSetupImpl.java:945)
    	... 33 more
    Voici mes classes
    Autorisation :
    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
     
    @Entity
    @Table(name = "autorisation", schema = "public")
    public class Autorisation extends Catalog implements Serializable{
     
    	private Long id;
     
    	private Set<Utilisateur> utilisateurs = new HashSet<Utilisateur>();
     
    	private Set<Role> roles = new HashSet<Role>();
     
     
    	public Autorisation(){}
     
     
    	@Override
    	@Id
    	@SequenceGenerator(name = "seq_autorisation", sequenceName = "autorisation_id_seq", allocationSize = 1)
    	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_autorisation")
    	@Column(name = "id")
    	public Long getId() {
    		return id;
    	}
    	public void setId(Long id) {
    		this.id = id;
    	}
     
    	@ManyToMany
    	public Set<Utilisateur> getUtilisateurs() {
    		return utilisateurs;
    	}
    	public void setUtilisateurs(Set<Utilisateur> utilisateurs) {
    		this.utilisateurs = utilisateurs;
    	}
     
    	@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    	@JoinTable(name = "autorisationRole", schema = "public",
    		joinColumns = { @JoinColumn(name = "autorisation", nullable = false, updatable = false) },
    		inverseJoinColumns = { @JoinColumn(name = "role", nullable = false, updatable = false) })
    	public Set<Role> getRoles() {
    		return roles;
    	}
     
     
    	public void setRoles(Set<Role> roles) {
    		this.roles = roles;
    	}
     
     
    	@Override
    	public int hashCode() {
    		final int prime = 31;
    		int result = super.hashCode();
    		result = prime * result + ((id == null) ? 0 : id.hashCode());
    		result = prime * result + ((roles == null) ? 0 : roles.hashCode());
    		result = prime * result
    				+ ((utilisateurs == null) ? 0 : utilisateurs.hashCode());
    		return result;
    	}
     
     
    	@Override
    	public boolean equals(Object obj) {
    		if (this == obj)
    			return true;
    		if (!super.equals(obj))
    			return false;
    		if (getClass() != obj.getClass())
    			return false;
    		Autorisation other = (Autorisation) obj;
    		if (id == null) {
    			if (other.id != null)
    				return false;
    		} else if (!id.equals(other.id))
    			return false;
    		if (roles == null) {
    			if (other.roles != null)
    				return false;
    		} else if (!roles.equals(other.roles))
    			return false;
    		if (utilisateurs == null) {
    			if (other.utilisateurs != null)
    				return false;
    		} else if (!utilisateurs.equals(other.utilisateurs))
    			return false;
    		return true;
    	}
     
    }
    Role :
    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
     
    @Entity
    @Table(name = "autorisation", schema = "public")
    public class Autorisation extends Catalog implements Serializable{
     
    	private Long id;
     
    	private Set<Utilisateur> utilisateurs = new HashSet<Utilisateur>();
     
    	private Set<Role> roles = new HashSet<Role>();
     
     
    	public Autorisation(){}
     
     
    	@Override
    	@Id
    	@SequenceGenerator(name = "seq_autorisation", sequenceName = "autorisation_id_seq", allocationSize = 1)
    	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_autorisation")
    	@Column(name = "id")
    	public Long getId() {
    		return id;
    	}
    	public void setId(Long id) {
    		this.id = id;
    	}
     
    	@ManyToMany
    	public Set<Utilisateur> getUtilisateurs() {
    		return utilisateurs;
    	}
    	public void setUtilisateurs(Set<Utilisateur> utilisateurs) {
    		this.utilisateurs = utilisateurs;
    	}
     
    	@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    	@JoinTable(name = "autorisationRole", schema = "public",
    		joinColumns = { @JoinColumn(name = "autorisation", nullable = false, updatable = false) },
    		inverseJoinColumns = { @JoinColumn(name = "role", nullable = false, updatable = false) })
    	public Set<Role> getRoles() {
    		return roles;
    	}
     
     
    	public void setRoles(Set<Role> roles) {
    		this.roles = roles;
    	}
     
     
    	@Override
    	public int hashCode() {
    		final int prime = 31;
    		int result = super.hashCode();
    		result = prime * result + ((id == null) ? 0 : id.hashCode());
    		result = prime * result + ((roles == null) ? 0 : roles.hashCode());
    		result = prime * result
    				+ ((utilisateurs == null) ? 0 : utilisateurs.hashCode());
    		return result;
    	}
     
     
    	@Override
    	public boolean equals(Object obj) {
    		if (this == obj)
    			return true;
    		if (!super.equals(obj))
    			return false;
    		if (getClass() != obj.getClass())
    			return false;
    		Autorisation other = (Autorisation) obj;
    		if (id == null) {
    			if (other.id != null)
    				return false;
    		} else if (!id.equals(other.id))
    			return false;
    		if (roles == null) {
    			if (other.roles != null)
    				return false;
    		} else if (!roles.equals(other.roles))
    			return false;
    		if (utilisateurs == null) {
    			if (other.utilisateurs != null)
    				return false;
    		} else if (!utilisateurs.equals(other.utilisateurs))
    			return false;
    		return true;
    	}
     
    }
    AutorisationRole
    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
     
    @Entity
    @Table(name="autorisation_role", schema = "public")
    public class AutorisationRole implements java.io.Serializable{
     
    	/**
             * 
             */
    	private static final long serialVersionUID = -7454274001606078654L;
     
    	private Boolean droit;
     
    	private AutorisationRoleId autorisationRoleId;
     
    	public AutorisationRole() {
    	}
     
    	public AutorisationRole(boolean droit, Autorisation autorisation, Role role) {
    		this.droit = droit;
    		this.autorisationRoleId = new AutorisationRoleId(autorisation, role);
    	}
     
    	@Column(nullable = false)
    	@NotNull
    	public Boolean getDroit() {
    		return droit;
    	}
     
    	public void setDroit(Boolean droit) {
    		this.droit = droit;
    	}
     
    	@EmbeddedId
    	public AutorisationRoleId getAutorisationRoleId() {
    		return autorisationRoleId;
    	}
     
    	public void setAutorisationRoleId(AutorisationRoleId autorisationRoleId) {
    		this.autorisationRoleId = autorisationRoleId;
    	}
    }

    AutorisationRoleId
    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
     
    @Embeddable
    public class AutorisationRoleId implements Serializable{
    	/**
             * 
             */
    	private static final long serialVersionUID = -9089854078739591067L;
    	private Autorisation autorisation;
    	private Role role;
     
    	public AutorisationRoleId() {
    	}
     
    	public AutorisationRoleId(Autorisation autorisation, Role role) {
    		this.autorisation = autorisation;
    		this.role = role;
    	}
     
    	@Column(name="autorisation")
    	public Autorisation getAutorisation() {
    		return autorisation;
    	}
     
    	public void setAutorisation(Autorisation autorisation) {
    		this.autorisation = autorisation;
    	}
     
    	@Column(name="role")
    	public Role getRole() {
    		return role;
    	}
     
    	public void setRole(Role role) {
    		this.role = role;
    	}
     
    	@Override
    	public int hashCode() {
    		final int prime = 31;
    		int result = 1;
    		result = prime * result
    				+ ((autorisation == null) ? 0 : autorisation.hashCode());
    		result = prime * result + ((role == null) ? 0 : role.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;
    		AutorisationRoleId other = (AutorisationRoleId) obj;
    		if (autorisation == null) {
    			if (other.autorisation != null)
    				return false;
    		} else if (!autorisation.equals(other.autorisation))
    			return false;
    		if (role == null) {
    			if (other.role != null)
    				return false;
    		} else if (!role.equals(other.role))
    			return false;
    		return true;
    	}
    }

  5. #5
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 938
    Par défaut
    Bonjour, essaie de suivre ce qui est fait sur ce lien

Discussions similaires

  1. [AC-2007] Liaison de deux tables à structure identique avec colonne memo
    Par benji971 dans le forum Access
    Réponses: 6
    Dernier message: 25/11/2014, 13h09
  2. [MySQL] Requête sur table de jointure avec not in ou not exists
    Par GueloSuperStar dans le forum Langage SQL
    Réponses: 12
    Dernier message: 08/03/2013, 15h01
  3. [AC-2007] Jointure avec colonne Lookup (liste sharepoint)
    Par nonoxp dans le forum Requêtes et SQL.
    Réponses: 0
    Dernier message: 18/02/2011, 14h07
  4. Pb pour créer table de jointure avec un attribut
    Par cissou06 dans le forum Ruby on Rails
    Réponses: 0
    Dernier message: 28/05/2008, 17h30
  5. Table de jointure avec attribut
    Par zybay dans le forum Hibernate
    Réponses: 18
    Dernier message: 22/06/2007, 23h17

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