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...
}
}