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 :

[Hibernate annotations] clé composée


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    509
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 509
    Par défaut [Hibernate annotations] clé composée
    Bonjour,
    j'aurais besoins d'un coup de main sur le mapping d'une table!
    J'ai une table dont la clé est composé de 2 champs, chacun de ces champs est aussi une clé etrangere vers une autre table.

    J'ai donc une classe A et une classe B mappé correctement, la classe C devrait avoir comme ID une classe CPk contenant en attribut une classe A et une classe B (sachant que l'id de C est la clé premaire de A + clé primaire de B).

    J'ai cherché un peu et j'ai trouvé ca dans la doc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    @AssociationOverride( name="pk.operateur.id", joinColumns = @JoinColumn(name="operateur") )
    public class C implements Serializable {
    	@EmbeddedId
    	private CPk pk;
     
    .... etc
    J'ai alors l'erreur de compile suivante au niveau du @joinColumn ... :
    Table "null" for join column "operateur" cannot be resolved
    puis la classe CPk :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    @Embeddable
    public class CPk implements Serializable {
    	@ManyToOne(targetEntity=A.class,fetch=FetchType.EAGER)
    	private A operateur;
     
    	@ManyToOne(targetEntity=B.class)
    	private B sourceacqsite;
    Et la j'ai l'erreur de compile suivante au niveau des many to one :

    Attribute "operateur" has invalid mapping type in this context
    Si quelqu'un a une idée ...

    Merci d'avance !

  2. #2
    Membre confirmé
    Inscrit en
    Septembre 2007
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 89
    Par défaut
    essai d'adapter ce code parce que moi j'ai une table d'association qui prends els comme clé primaire la clé composée des deux clés des table correspondante. j'ai une table produit et une table commandeclient et comme table d'association Lignedecommande.
    voici le code de la table d'association:
    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
    public class LigneCommandeClient {
    	@Embeddable
    	public static class Id implements Serializable{
     
    		private static final long serialVersionUID = 1L;
    		@Column(name="product_id")
    		private Long productId;
    		@Column(name="cmde_id")
    		private Long cmdeId;
     
    		public Long getCmdeId() {
    			return cmdeId;
    		}
    		public void setCmdeId(Long cmdeId) {
    			this.cmdeId = cmdeId;
    		}
    		public Long getProductId() {
    			return productId;
    		}
    		public void setProductId(Long productId) {
    			this.productId = productId;
    		}
    	/*public Id(){}
    		public Id(Long productId,Long cmdeId){
    			this.productId=productId;
    			this.cmdeId=cmdeId;
    		}*/
    	public boolean equals(Object o){
    		if(o!=null && o instanceof Id){
    			Id that=(Id)o;
    			return this.productId.equals(that.productId)&& this.cmdeId.equals(that.cmdeId);
    		}
    		else{
    			return false;
    		}
    	}
    	public int hashCode(){
    		return productId.hashCode()+cmdeId.hashCode();
    	}
    	}
     
    	private Id id=new Id();
    	private Produit product;
    	private CommandeClient cmdeclient;
    	private long quantite;
    	public LigneCommandeClient(){}
    	public LigneCommandeClient(long quantite,Produit product,CommandeClient cmdeclient){
    		//set Fields
    		this.quantite=quantite;
    		this.product=product;
    		this.cmdeclient=cmdeclient;
    		//set identifier values
    		this.id.setCmdeId(cmdeclient.getId());
    		this.id.setProductId(product.getId());
     
    	}
    	@ManyToOne
    	@JoinColumn(name="id",insertable=false,updatable=false)
    	public CommandeClient getCmdeclient() {
    		return cmdeclient;
    	}
    	public void setCmdeclient(CommandeClient cmdeclient) {
    		this.cmdeclient = cmdeclient;
    	}
    	@ManyToOne
    	@JoinColumn(name="id",insertable=false,updatable=false)
    	public Produit getProduct() {
    		return product;
    	}
    	public void setProduct(Produit product) {
    		this.product = product;
    	}
    	public long getQuantite() {
    		return quantite;
    	}
    	public void setQuantite(long quantite) {
    		this.quantite = quantite;
    	}
    	@EmbeddedId
    	public Id getId() {
    		return id;
    	}
    	public void setId(Id id) {
    		this.id = id;
    	}
    	@Override
    	public int hashCode() {
    		final int prime = 31;
    		int result = 1;
    		result = prime * result
    				+ ((cmdeclient == null) ? 0 : cmdeclient.hashCode());
    		result = prime * result + ((id == null) ? 0 : id.hashCode());
    		result = prime * result + ((product == null) ? 0 : product.hashCode());
    		result = prime * result + (int) (quantite ^ (quantite >>> 32));
    		return result;
    	}
    	@Override
    	public boolean equals(Object obj) {
    		if (this == obj)
    			return true;
    		if (obj == null)
    			return false;
    		if (getClass() != obj.getClass())
    			return false;
    		final LigneCommandeClient other = (LigneCommandeClient) obj;
    		if (cmdeclient == null) {
    			if (other.cmdeclient != null)
    				return false;
    		} else if (!cmdeclient.equals(other.cmdeclient))
    			return false;
    		if (id == null) {
    			if (other.id != null)
    				return false;
    		} else if (!id.equals(other.id))
    			return false;
    		if (product == null) {
    			if (other.product != null)
    				return false;
    		} else if (!product.equals(other.product))
    			return false;
    		if (quantite != other.quantite)
    			return false;
    		return true;
    	}
     
     
     
    }

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2005
    Messages : 8
    Par défaut
    Bonjour,

    J'ai actuellement le même souci que FreshVic en essayant de compiler un petit exemple dans un projet eclipse JPA.

    Ce qui me gène avec la proposition de solution, c'est qu'on passe d'un code où l'on a dans la classe ID des références explicites aux classes entity :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    @ManyToOne(targetEntity=A.class,fetch=FetchType.EAGER)
    	private A operateur;
     
    	@ManyToOne(targetEntity=B.class)
    	private B sourceacqsite;
    à une solution où la référence se fait au niveau des foreign key :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    @Column(name="product_id")
    		private Long productId;
    		@Column(name="cmde_id")
    		private Long cmdeId;
    Note : J'ai réussi à compiler et exécuter le même exemple dans un projet eclipse "java".

Discussions similaires

  1. Hibernate Annotations 3.2.1
    Par j_eljin dans le forum Hibernate
    Réponses: 8
    Dernier message: 29/12/2006, 03h30
  2. Hibernate Annotations documentation bancale ?
    Par cyrille37 dans le forum Hibernate
    Réponses: 3
    Dernier message: 25/07/2006, 18h53
  3. [Hibernate] Clef primaire composée
    Par mehdi_31 dans le forum Hibernate
    Réponses: 1
    Dernier message: 26/06/2006, 16h35
  4. Réponses: 1
    Dernier message: 26/06/2006, 10h21
  5. [Hibernate Annotation] Mapper une classe abstraite
    Par DanZzz dans le forum Hibernate
    Réponses: 3
    Dernier message: 15/06/2006, 22h12

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