-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 4 posts ] 
Author Message
 Post subject: Colonne à la fois clé primaire et clé étrangère.
PostPosted: Thu Apr 01, 2010 12:08 pm 
Newbie

Joined: Thu Apr 01, 2010 10:52 am
Posts: 2
Bonjour,

Avec Hibernate 3, est-il possible de mapper une table dont la clé primaire est composite et dont les clés étrangères réutilisent
l'une des colonnes de la clé primaire ?

Je pose la question car je n'y parviens pas.

Exemple avec 2 tables :

* FAMILLE avec 2 colonnes :
- entier ID_F (pk)
- varchar NOM

* MEMBRE avec 2 colonnes :
- entier ID_F (pk) (fk vers FAMILLE.ID_F)
- entier IF_M (pk)
- varchar PRENOM


Pour le mapping de Famille, pas de problème.

Pour le mapping de Membre, j'ai essayé la solution ci-dessous (généré par hbm2java) et des variantes. Mais ça ne marche pas.
Pour les insertions, Hibernate génère un ordre sql insert sans la colonne Id_F. Il semble que le fait que cette colonne soit à la fois pk et fk perturbe le mécanisme.
(J'ai dupliqué la colonne ID_F de MEMBRE (en ID_F pour la pk et ID_F2 pour la fk). Et là, les ordre sql "insert" sont corrects.

Avez-vous des idées pour m'aider ?



----------------------- Le mapping ----------------------------

Code:
@Entity
@Table(name = "MEMBRE", uniqueConstraints = @UniqueConstraint(columnNames = { "ID_F", "IF_M" }))
public class Membre extends BaseEntity implements java.io.Serializable {

   private MembreId id;
   private Famille famille;
   private String prenom;

   @EmbeddedId
   @AttributeOverrides( {
      @AttributeOverride(name = "Id_f", column = @Column(name = "ID_F", nullable = false, precision = 22, scale = 0)),
      @AttributeOverride(name = "If_m", column = @Column(name = "IF_M", nullable = false, precision = 22, scale = 0)) })
   public MembreId getId() {
      return this.id;
   }


   @ManyToOne(fetch = FetchType.LAZY)
   @JoinColumn(name = "ID_F", insertable = false, updatable = false)
   public Famille getFamille() {
      return this.famille;
   }
   
   @Column(name = "PRENOM", nullable = false, length = 4000)
   public String getPrenom() {
      return this.prenom;
   }
}


@Embeddable
public class MembreId implements java.io.Serializable {

   private BigDecimal id_f;
   private BigDecimal id_m;

   public MembreId() {
   }

   public CombustibleId(BigDecimal id_f, BigDecimal id_m) {
      this.id_f = id_f;
      this.id_m = id_m;
   }

   @Column(name = "ID_F", nullable = false, precision = 22, scale = 0)
   public BigDecimal getId_f() {
      return this.id_f;
   }

   public void setd_f(BigDecimal id_f) {
      this.id_f = id_f;
   }

   @Column(name = "ID_M", nullable = false, precision = 22, scale = 0)
   public BigDecimal getId_m() {
      return this.getId_m;
   }

   public void setId_m(BigDecimal id_m) {
      this.id_m = id_m;
   }

   public boolean equals(Object other) {
   .... je coupe...
   }

   public int hashCode() {
   .... je coupe...
   }

}


Top
 Profile  
 
 Post subject: Re: Colonne à la fois clé primaire et clé étrangère.
PostPosted: Fri Apr 02, 2010 6:22 am 
Regular
Regular

Joined: Thu May 07, 2009 5:56 am
Posts: 94
Location: Toulouse, France
salut,
j'ai essayé de reproduire ton cas et je n'ai pas ce comportement q tu décris. Apparemment, le fait qu'une fk fasse parte de la clé de la pk composite ne pose pas de pb pour Hibernate.

voilà le code testé..
Code:
tx.begin();
Famille lesDupont = new Famille();
Membre unMembre = new Membre(lesDupont, "Machand");
em.persist(lesDupont);
em.persist(unMembre);
tx.commit();


Code:
Hibernate: insert into Famille (NOM, idF) values (?, ?)
Hibernate: insert into MEMBRE (PRENOM, ID_F, ID_M) values (?, ?, ?)


Schema SQL Table Membre sur PostgreSQL
Code:
id_f numeric(22) NOT NULL,
id_m numeric(22) NOT NULL,
prenom character varying(4000) NOT NULL,
  CONSTRAINT membre_pkey PRIMARY KEY (id_f, id_m),
  CONSTRAINT fk87558020f8161b0 FOREIGN KEY (id_f)
      REFERENCES famille (idf) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION


j'ai repris tes classes (en les ajustant à mon test...). Quelle est ta classe BaseEntity? elle définit une stratégie de mapping ? comporte un @Id ? il se peut q ton pb viennent du mapping de cette classe...

_________________
everything should be made as simple as possible, but not simpler (AE)


Top
 Profile  
 
 Post subject: Re: Colonne à la fois clé primaire et clé étrangère.
PostPosted: Fri Apr 02, 2010 6:56 am 
Newbie

Joined: Thu Apr 01, 2010 10:52 am
Posts: 2
Ca ne doit pas venir de BaseEntity :

Code:
public abstract class BaseEntity implements Serializable {

    private static final long serialVersionUID = 1L;

}


J'utilise Hibernate core 3.4.0 ga.
De ton coté ?


Top
 Profile  
 
 Post subject: Re: Colonne à la fois clé primaire et clé étrangère.
PostPosted: Fri Apr 02, 2010 7:09 am 
Regular
Regular

Joined: Thu May 07, 2009 5:56 am
Posts: 94
Location: Toulouse, France
hibernate-core-3.3.2.GA
(avec)
hibernate-annotations-3.4.0
hibernate-commons-annotations-3.1.0
hibernate-entitymanager-3.4.0

Dialect postgresql (bd PostrgreSQL 8.3)

_________________
everything should be made as simple as possible, but not simpler (AE)


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 4 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.