Ich habe zwei JPA-Entitäten (Client, InstrumentTraded) mit Hibernate als Provider erstellt, die eine ManyToMany-Beziehung haben. Nachdem Hibernate die Tabellen für MySQL generiert hat, scheint die ManyToMany-Beziehungstabelle keine Primärschlüssel für die beiden Fremdschlüssel zu enthalten. Dies ermöglicht doppelte Datensätze in der Viele-zu-Viele-Tabelle, was nicht das gewünschte Ergebnis ist.ManyToMany-Beziehung, die JPA mit Hibernate-Provider verwendet, erstellt keine Primärschlüssel
Tabellen generiert:
client(id,name)
instrument_traded(id,name)
client_instrument_traded(FK client_id, FK instrument_traded_id)
Bevorzugte Tabelle:
client_instrument_traded(PK,FK client_id, PK,FK instrument_traded_id)
Instanzen:
@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;
}
...
}
Nach einigem tun Forschung es sieht aus wie die einzige Lösung ist für mapping a join table with additional columns mit @OneToMany
@IdClass
und eine zusammengesetzte Primärschlüssel-Klasse, wenn ich keine zusätzlichen Spalten benötigen. Ist dies die einzige Lösung neben der, die ich in den obigen Code aufgenommen habe, die eine @UniqueConstraint
mit den zwei Fremdschlüsselspalten auf der @ManyToMany
Zuordnung verwendet? Es scheint ein bisschen lächerlich, wie viel Arbeit für ein solches Szenario nötig ist. Vielen Dank!
http://stackoverflow.com/questions/1212058/how-to-make-a-composite-primary-key-java-persistence-annotation/6344626#6344626 – steveeen
Auch lohnt sich zu überprüfen, ob Sie versehentlich nicht hinzugefügt haben eine Aufnahme zweimal, das ist mir passiert, also 'list.add (x); list.add (x); 'Ergebnisse in Listen duplizieren. – CsBalazsHungary