Tôi đã tạo hai thực thể JPA (Client, InstrumentTraded) sử dụng Hibernate làm nhà cung cấp có mối quan hệ ManyToMany. Sau khi cho phép Hibernate tạo các bảng cho MySQL, có vẻ như bảng quan hệ ManyToMany không chứa các khóa chính cho hai khóa ngoài. Điều này cho phép các bản ghi trùng lặp trong bảng nhiều đến nhiều, không phải là kết quả mong muốn.Mối quan hệ ManyToMany sử dụng JPA với nhà cung cấp Hibernate không tạo khóa chính
Bàn tạo:
client(id,name)
instrument_traded(id,name)
client_instrument_traded(FK client_id, FK instrument_traded_id)
bảng ưa thích:
client_instrument_traded(PK,FK client_id, PK,FK instrument_traded_id)
Đối tượng:
@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;
}
...
}
Sau khi thực hiện một số nghiên cứu có vẻ như giải pháp duy nhất là dành cho mapping a join table with additional columns sử dụng @OneToMany
@IdClass
và lớp khóa chính hỗn hợp khi tôi không cần thêm cột. Đây có phải là giải pháp duy nhất bên cạnh giải pháp mà tôi đã đưa vào mã bên trên, sử dụng một mã số @UniqueConstraint
với hai cột khóa ngoài trên ánh xạ @ManyToMany
không? Có vẻ như một chút vô lý về số lượng công việc cần thiết cho một kịch bản chung như thế này. Cảm ơn!
http://stackoverflow.com/questions/1212058/how-to-make-a-composite-primary-key-java-persistence-annotation/6344626#6344626 – steveeen
Cũng đáng để kiểm tra xem bạn vô tình không thêm một bản ghi hai lần, điều này đã xảy ra với tôi, vì vậy 'list.add (x); list.add (x); 'kết quả trùng lặp trong danh sách. – CsBalazsHungary