Pour mettre en correspondance une clé composite, vous pouvez utiliser la fonction EmbeddedId
o el IdClass
annotations. Je sais que cette question n'est pas strictement liée à JPA mais les règles définies par la spécification s'appliquent également. Les voici donc :
2.1.4 Clés primaires et identité des entités
...
Une clé primaire composite doit correspondre soit à une seule unique ou à un ensemble de champs ou de ou à un ensemble de tels champs ou propriétés, comme décrites ci-dessous. Une classe de clé primaire doit être définie pour représenter une clé primaire composite. Composite composites se produisent généralement lorsque mappage à partir de bases de données anciennes, lorsque la base de données est composée de plusieurs colonnes. El EmbeddedId
et IdClass
Les annotations sont utilisées pour pour désigner les clés primaires composites. Voir sections 9.1.14 et 9.1.15.
...
Les règles suivantes s'appliquent aux clés primaires composites :
- La classe de clé primaire doit être publique et doit avoir un constructeur public sans argument. public sans argument.
- Si l'accès basé sur les propriétés est utilisé, les propriétés de la clé primaire doivent être publiques ou protégées.
- La classe de la clé primaire doit être
serializable
.
-
La classe de clé primaire doit définir
equals
y hashCode
méthodes. La sémantique de l'égalité des valeurs pour ces méthodes doit être cohérente avec l'égalité des bases de données pour les types de base de données auxquels la clé est mappée.
- Une clé primaire composite doit soit être représentée et mappée en tant que classe intégrable (voir Section 9.1.14, "Annotation EmbeddedId") ou doit être représentée et mise en correspondance avec plusieurs champs ou propriétés de la classe (voir la section 9.1.15, "Annotation IdClass Annotation").
- Si la classe de clé primaire composite est mise en correspondance avec plusieurs champs ou propriétés de la classe d'entité, les noms des champs de clé primaire ou des propriétés de la classe de clé primaire et ceux de la classe d'entité doivent correspondre et leurs types doivent être les même.
Avec un IdClass
La classe pour la clé primaire composite pourrait ressembler à (pourrait être une classe interne statique) :
public class TimePK implements Serializable {
protected Integer levelStation;
protected Integer confPathID;
public TimePK() {}
public TimePK(Integer levelStation, Integer confPathID) {
this.levelStation = levelStation;
this.confPathID = confPathID;
}
// equals, hashCode
}
Et l'entité :
@Entity
@IdClass(TimePK.class)
class Time implements Serializable {
@Id
private Integer levelStation;
@Id
private Integer confPathID;
private String src;
private String dst;
private Integer distance;
private Integer price;
// getters, setters
}
El IdClass
fait correspondre plusieurs champs à la table PK.
Avec EmbeddedId
La classe pour la clé primaire composite pourrait ressembler à (pourrait être une classe interne statique) :
@Embeddable
public class TimePK implements Serializable {
protected Integer levelStation;
protected Integer confPathID;
public TimePK() {}
public TimePK(Integer levelStation, Integer confPathID) {
this.levelStation = levelStation;
this.confPathID = confPathID;
}
// equals, hashCode
}
Et l'entité :
@Entity
class Time implements Serializable {
@EmbeddedId
private TimePK timePK;
private String src;
private String dst;
private Integer distance;
private Integer price;
//...
}
El @EmbeddedId
fait correspondre une classe PK à une table PK.
Différences :
- Du point de vue du modèle physique, il n'y a pas de différences
-
@EmbeddedId
communique d'une certaine manière plus clairement que la clé est une clé composite et que l'OMI a du sens. lorsque le pk combiné est soit une entité significative en soi soit réutilisé dans votre code .
-
@IdClass
est utile pour spécifier qu'une certaine combinaison de champs est unique, mais ceux-ci n'ont pas de signification particulière. .
Ils affectent également la manière dont vous écrivez les requêtes (en les rendant plus ou moins verbeuses) :
Références
- Spécification JPA 1.0
- Section 2.1.4 " Clés primaires et identité d'entité
- Section 9.1.14 "Annotation EmbeddedId" (en anglais)
- Section 9.1.15 "IdClass Annotation" (Annotation de classe d'identité)
0 votes
Voir stackoverflow.com/questions/2562746/jpa-entity-design-problem/
1 votes
Une très bonne série d'exemples : vladmihalcea.com/2016/08/01/