klee-contrib / topmodel

Outil de modélisation et générateurs pour divers langages
https://klee-contrib.github.io/topmodel/#/
MIT License
9 stars 9 forks source link

Gestion de clés primaires composites pour de vrai #204

Closed JabX closed 1 year ago

JabX commented 1 year ago

Les clés primaires composites ont toujours été un peu supportées, de deux façons différentes :

Dans les deux cas, ce n'était géré que dans les générateurs SQL, les autres générateurs ne supportaient pas du tout le concept.

Il existe plusieurs cas valides pour faire des clés primaires composites, le premier étant bien entendu une association N-N explicite (et en particulier lorsqu'on veut mettre des propriétés dessus en plus, en aucun cas elle ne pourrait être autogénérée).

Cette PR permet donc d'officialiser le support des clés primaires composites en retirant l'erreur et le paramètre associé qui permettait de la désactiver, et explique aux générateurs qu'une classe peut avoir plusieurs clés primaires. De plus, il est désormais possible de spécifier une propriété d'association comme primaryKey (qu'elle fasse parti d'une clé primaire composite ou non). Il n'y a donc plus de règle implicite sur "toutes les propriétés sont des associations = PK", il suffit de déclarer explicitement les propriétés comme faisant partie de la clé primaire.

Il est impossible de déclarer une association vers une classe avec une clé primaire composite (cette erreur existait déjà d'ailleurs ;) ), et il est également impossible de définir une classe avec clé primaire composite comme reference ou avec des values. Cette deuxième restriction est peut être un peu forte (genre on devrait peut être pouvoir initialiser une n-n avec des values ?), mais :

Idéalement il faudrait faire un tour autour de la gestion des values de manière plus globale, parce qu'il y a aussi d'autres cas d'usages possibles qui sont limités par des restrictions plus ou moins arbitraires...

Je ne suis pas sur de ce qu'il faudrait faire (et si c'est possible d'ailleurs) en JPA pour que ça marche vraiment (à priori en l'état ça devrait juste générer deux colonnes avec @Id ?). J'ai aussi supprimé la génération de la séquence en SQL si la PK est composite, puisque je sais pas trop quoi faire ici.

En C#, une PK composite n'a pas d'attribut [Key] sur la propriété, et on configure la clé primaire dans le DbContext avec les propriétés multiples (et ça marche très bien, y compris pour la migration).

gideruette commented 1 year ago

En JPA : https://www.baeldung.com/jpa-composite-primary-keys. A priori on implémenterait avec IdClass, puisque son seul inconvéniant est de devoir écrire deux fois les champs, ce qui n'est pas un problème puisque tout est généré