Votre question

Problème JPA/Hibernate clé primaire composite

Tags :
  • Primary
  • Programmation
Dernière réponse : dans Programmation
15 Juin 2009 11:16:33

Bonjour à tous,

Je débute avec JPA/Hibernate et je me retrouve confronté à un problème.

J'ai une base de données composées de plusieurs table liés entre elle, jusque la rien d'extraordinaire.
Mon problème et le suivant:

J'ai les tables suivante:

A: a (PK), nom
B: b(pk), nom
C: a(FK A:a), b(FK B:b), data

Ma table C n'a donc pas de primary key, j'ai donc décidé que a+b formerais ma PK. Mon problème est que je n'arrive pas à établir les relations manytoone et onetomany entre mes tables.

Quelqu'un aurait il une idée de comment faire car je bloc dessus depuis plusieurs heure.

Merci.

Autres pages sur : probleme jpa hibernate cle primaire composite

16 Juin 2009 09:54:00

Bonjour,

Ta table C est une table de jointure, tu n'as donc pas besoin de clef primaire
Pour établir les relations, tu devras te servir de jointures (INNER JOIN par exemple)
m
0
l
16 Juin 2009 10:02:22

Sauf qu'avec JPA je suis obligé d'avoir des clés primaires ;) 
m
0
l
Contenus similaires
16 Juin 2009 10:12:37

Mais tu n'es pas obligé de faire en sorte que ta PK soit composée de tes deux FK ?? Si ?
Tu peux faire un truc du genre :
C: key(PK), a(FK A:a), b(FK B:b), data
La PK est gérée par JPA et toi de ton côté tu peux établir tes relations.

PS : j'ai jamais utilisé JPA et je connais mal le monde Java :) 
m
0
l
16 Juin 2009 10:21:34

je pourrais rajouter une key comme tu le fais mais mon mcd n'est pas comme ça et j'ai trop de donné pour faire ça, d'où ma clé composite.
m
0
l
16 Juin 2009 10:34:07

Oui mais ça ne change pas ton MCD puisque celui-ci est conçu pour faire de ta table C une table de jointure, et donc ne pas utiliser la PK
En fait ça rajoute juste un champ de plus mais si tu as la possibilité de le faire ça règle le problème.

Quand à la volumétrie, rajouter une PK sur une table, même très grosse, n'a jamais planté une base. Et puis d'après ce que j'ai compris tu es obligé d'en avoir une :) 
m
0
l
16 Juin 2009 10:40:26

Sauf si tu dépasse la taille d'un int et la t'es dans la merde.

De plus tu perds de la place pour rien vue que cette key ne sert à rien.
m
0
l
16 Juin 2009 11:00:37

Un int32 va jusqu'à 2 147 483 647 quand il est signed, en unsigned c'est le double
Bon courage pour le dépasser ^^

Un int32 prend 4 octets, il faut vraiment avoir de très très grosses bases pour que ça devienne imposant. Si tu as 2 milliards d'enregistrements ça te prend 8 Go en plus.

Enfin bref... A part ça je n'ai pas de solution.
Mais si tu rechignes pour mettre un int en PK, pourquoi tu voulais à l'origine mettre a+b ?
m
0
l
16 Juin 2009 11:28:41

Merci je sais ce qu'est un int ^^.

Je veux mettre a + b car ça me permet de le retrouver mes datas. Maintenant 4 milliard de data, c'est pas impossible suivant les données que tu dois gérer ;) 
m
0
l
16 Juin 2009 12:01:46

Il y a quoi dans le champ data ? a+b ?
m
0
l
16 Juin 2009 12:06:17

a, c'est la PK de A
b, c'est la PK de B

a+b est géré par le sgdb, il en fait se qu'il veut ^^
m
0
l
16 Juin 2009 12:17:57

J'avoue avoir du mal à te proposer une bonne solution :s
Par contre je suis certain que ta solution avec a+b n'est pas solide... Désolé de ne pas pouvoir t'aider plus, mais comme je te l'ai dit, je ne connais pas JPA
m
0
l
16 Juin 2009 12:29:31

Pourquoi a+b ne serait pas solide ?
m
0
l
16 Juin 2009 12:40:49

Ben disons que ça me parait bizarre de devoir bricoler un arrangement avec les PK pour pouvoir persister et retrouver ses relations. C'est tout de même une opération assez courante, et l'API doit pouvoir être capable de le gérer, mais il faudrait un connaisseur de JPA.
Je n'en suis pas un :sweat: 
m
0
l
9 Juillet 2009 16:15:48

Salut,
Je viens de voir ton problème alors que je suis sur un problème pas mal similaire.

J'ai déjà été confronté à ce dont tu fait par et en voici ma solution. Soit-dit en passant, je ne vois pas ce que tu veux dire par JPA, moi je suis avec hibernate, c'est pas mal flou mais je te donne ma solution sa ne peut que t'aider.

Donc tu défini une classe TableCPK, qui est comme suis :

@Embeddable
public class TableCPK implements Serializable {

@ManyToOne
@JoinColumn ...
private // ta primière jointure : un sur t1


@ManyToOne
@JoinColumn ...
// ta 2iem jointure : deux sur t2


Tes getters and setters ....

}


Puis dans ta classe C :

@Entity
@Table (...)
@AssociationOverrides({
@AssociationOverride(name = "component.t1", joinColumns=@JoinColumn(name = "un")),
@AssociationOverride(name = "component.t2", joinColumns=@JoinColumn(name = "deux"))})
public class ... {

...

@Embedded Id
private tableCPK component ;

...
}

Voila en gros comment j'ai procédé.

Cependant, avac hibernate. tu n'as pas besoin de mapper les tables de jointure. Pour cela, il faut utiliser joindTable dans les autre tables avec des info... C'est une chose sur laquelle je travaille donc je n'ai pas encore bien saisi le principe.

Bonne journé


m
0
l
9 Juillet 2009 16:36:54

Merci mais j'ai trouvé la soluce ;)  et JPA c'est le standard java pour la persistance.
m
0
l
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS