Bonjour,
Pour faire court, je suis novice, et j'ai commencé le développement d'un site e-commerce. Il m'a fallu du temps avant d'être satisfait de ma bdd. Sauf, que le problème survient au mapping. J'ai essayé différentes annotations que j'ai pus trouver, mais , rien n'y fait.
Comme vous pouvez le voir plus bas, j'ai une table detail. C'est celle-ci qui me pose problème, car elle n'a pas d'id "propre à la table" mais je joue sur 3 FK qui sont donc aussi des PK pour permettre l'unicité.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103 package fr.goweb.entities; import java.io.Serializable; import java.util.List; import javax.persistence.CascadeType; import javax.persistence.EmbeddedId; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.ForeignKey; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.IdClass; import javax.persistence.JoinColumn; import javax.persistence.JoinTable; import javax.persistence.ManyToOne; import javax.persistence.OneToMany; import javax.persistence.OneToOne; import javax.persistence.PrimaryKeyJoinColumn; import javax.persistence.Table; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonSetter; import fr.goweb.retail.entities.MCouleur; import fr.goweb.retail.entities.MTaille; import fr.goweb.retail.entities.Produit; @Entity @Table(name = "detail", catalog = "JOSE") public class Detail implements Serializable { private float prix; private int ttc; private Produit produit; private MCouleur mCouleur; private MTaille mTaille; public Detail() { super(); } public Detail(float prix) { super(); this.prix = prix; } public float getPrix() { return prix; } public int getTtc() { return ttc; } @PrimaryKeyJoinColumn(name="id_produit", foreignKey=@ForeignKey(name="FK_DETAIL_PRODUIT")) @ManyToOne(fetch=FetchType.LAZY,cascade=CascadeType.ALL) //@JoinColumn(name="id_produit", foreignKey=@ForeignKey(name="FK_DETAIL_PRODUIT")) public Produit getProduit() { return produit; } @PrimaryKeyJoinColumn(name="id_mcouleur", foreignKey=@ForeignKey(name="FK_DETAIL_MCOULEUR")) @ManyToOne(fetch=FetchType.LAZY,cascade=CascadeType.ALL) //@JoinColumn(name="id_mcouleur", foreignKey=@ForeignKey(name="FK_DETAIL_MCOULEUR")) public MCouleur getMCouleur() { return mCouleur; } @PrimaryKeyJoinColumn(name="id_mtaille", foreignKey=@ForeignKey(name="FK_DETAIL_MTAILLE")) @ManyToOne(fetch=FetchType.LAZY,cascade=CascadeType.ALL) //@JoinColumn(name="id_mtaille", foreignKey=@ForeignKey(name="FK_DETAIL_MTAILLE")) public MTaille getMTaille() { return mTaille; } public void setPrix(float prix) { this.prix = prix; } public void setTtc(int ttc) { this.ttc = ttc; } public void setProduit(Produit produit) { this.produit = produit; } @JsonSetter public void setMCouleur(MCouleur mCouleur) { this.mCouleur = mCouleur; } @JsonSetter public void setMTaille(MTaille mTaille) { this.mTaille = mTaille; } }
J'ai tenter la génération des models avec hibernate, celui-ci crée 2 tables :
detail.java
DetalId.java
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78 package fr.goweb.retail.entities; // Generated 16 avr. 2018 15:21:15 by Hibernate Tools 5.2.3.Final import javax.persistence.AttributeOverride; import javax.persistence.AttributeOverrides; import javax.persistence.Column; import javax.persistence.EmbeddedId; import javax.persistence.Entity; import javax.persistence.Table; /** * Detail generated by hbm2java */ @Entity @Table(name = "detail", catalog = "JOSE") public class Detail implements java.io.Serializable { private DetailId id; private Float prix; private Float ttc; private Integer stock; public Detail() { } public Detail(DetailId id) { this.id = id; } public Detail(DetailId id, Float prix, Float ttc, Integer stock) { this.id = id; this.prix = prix; this.ttc = ttc; this.stock = stock; } @EmbeddedId @AttributeOverrides({ @AttributeOverride(name = "idProduit", column = @Column(name = "id_produit", nullable = false)), @AttributeOverride(name = "idMcouleur", column = @Column(name = "id_mcouleur", nullable = false)), @AttributeOverride(name = "idMtaille", column = @Column(name = "id_mtaille", nullable = false)) }) public DetailId getId() { return this.id; } public void setId(DetailId id) { this.id = id; } @Column(name = "prix", precision = 12, scale = 0) public Float getPrix() { return this.prix; } public void setPrix(Float prix) { this.prix = prix; } @Column(name = "ttc", precision = 12, scale = 0) public Float getTtc() { return this.ttc; } public void setTtc(Float ttc) { this.ttc = ttc; } @Column(name = "stock") public Integer getStock() { return this.stock; } public void setStock(Integer stock) { this.stock = stock; } }
Je n'arrive pas à comprendre totalement pourquoi il fait comme cela.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50 package fr.goweb.retail.entities; import javax.persistence.Embeddable; import javax.persistence.JoinColumn; @Embeddable public class DetailId implements java.io.Serializable { private Produit produit; private MCouleur mCouleur; private MTaille mTaille; public DetailId() { } public DetailId(Produit produit, MCouleur mCouleur, MTaille mTaille) { this.produit = produit; this.mCouleur = mCouleur; this.mTaille = mTaille; } @JoinColumn(name = "id_produit", nullable = false) public Produit getProduit() { return this.produit; } public void setProduit(Produit produit) { this.produit = produit; } @JoinColumn(name = "id_mcouleur", nullable = false) public MCouleur getMcouleur() { return this.mCouleur; } public void setMCouleur(MCouleur mCouleur) { this.mCouleur = mCouleur; } @JoinColumn(name = "id_mtaille", nullable = false) public MTaille getMtaille() { return this.mTaille; } public void setMtaille(MTaille mTaille) { this.mTaille = mTaille; } }
Est-ce qu'il est, donc, possible de créer une entité possédant 3 FK en tant que que PK ?
La solution généré est-elle la meilleure façon de faire ?
Merci d'avance pour vos réponses.
EDIT: Hibernate ne génére que 4 Classes (Client, Commande, Detail -> DetailId, Produit), or j'ai 8 tables
Partager