J'ai créé deux entités JPA (Client, InstrumentTraded) en utilisant Hibernate en tant que fournisseur ayant une relation ManyToMany. Après avoir laissé Hibernate générer les tables pour MySQL, il apparaît que la table de relations ManyToMany ne contient pas de clés primaires pour les deux clés étrangères. Cela permet des enregistrements en double dans la table many-to-many, ce qui n'est pas le résultat souhaité.La relation ManyToMany utilisant JPA avec le fournisseur Hibernate ne crée pas de clés primaires
tables générées:
client(id,name)
instrument_traded(id,name)
client_instrument_traded(FK client_id, FK instrument_traded_id)
Table préféré:
client_instrument_traded(PK,FK client_id, PK,FK instrument_traded_id)
Entités:
@Entity
public class Client extends AbstractEntity<Integer> {
private static final long serialVersionUID = 1L;
@Basic(optional = false)
@Column(nullable = false, length = 125)
private String name;
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(joinColumns = {
@JoinColumn}, inverseJoinColumns = {
@JoinColumn(name = "instrument_traded_id")}, uniqueConstraints =
@UniqueConstraint(name = "UK_client_instruments_traded_client_id_instrument_traded_id",
columnNames = {"client_id", "instrument_traded_id"}))
@ForeignKey(name = "FK_client_instruments_traded_client_id",
inverseName = "FK_client_instruments_traded_instrument_traded_id")
private List<InstrumentTraded> instrumentsTraded;
public Client() {
}
public List<InstrumentTraded> getInstrumentsTraded() {
return instrumentsTraded;
}
public void setInstrumentsTraded(List<InstrumentTraded> instrumentsTraded) {
this.instrumentsTraded = instrumentsTraded;
}
...
}
@Entity
@Table(uniqueConstraints = {
@UniqueConstraint(name = "UK_instrument_traded_name", columnNames = {"name"})})
public class InstrumentTraded extends AbstractEntity<Integer> {
private static final long serialVersionUID = 1L;
@Basic(optional = false)
@Column(nullable = false, length = 50)
private String name;
@ManyToMany(mappedBy = "instrumentsTraded", fetch = FetchType.LAZY)
private List<Client> clients;
public InstrumentTraded() {
}
public List<Client> getClients() {
return clients;
}
public void setClients(List<Client> clients) {
this.clients = clients;
}
...
}
Après avoir fait quelques recherche, il semble que la seule solution est mapping a join table with additional columns en utilisant @OneToMany
@IdClass
et une classe de clé primaire composite lorsque je n'ai pas besoin de colonnes supplémentaires. Est-ce la seule solution à part celle que j'ai incluse dans le code ci-dessus, qui utilise un @UniqueConstraint
avec les deux colonnes de clé étrangère sur le mappage @ManyToMany
? Il semble un peu ridicule la quantité de travail nécessaire pour un scénario commun comme celui-ci. Merci!
http://stackoverflow.com/questions/1212058/how-to-make-a-composite-primary-key-java-persistence-annotation/6344626#6344626 – steveeen
Aussi vaut la peine de vérifier si vous n'avez pas ajouté accidentellement un enregistrement deux fois, cela m'est arrivé, alors 'list.add (x); list.add (x); 'les résultats sont dupliqués dans les listes. – CsBalazsHungary