2 pièce(s) jointe(s)
Mapping d'une table avec 3PK/FK
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é.
Pièce jointe 370647
Code:
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
Code:
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;
}
} |
DetalId.java
Code:
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;
}
} |
Je n'arrive pas à comprendre totalement pourquoi il fait comme cela.
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