我已经创建了两个使用Hibernate作为具有ManyToMany关系的提供程序的JPA实体(Client,InstrumentTraded)。让Hibernate为MySQL生成表之后,似乎ManyToMany关系表不包含这两个外键的主键。这允许多对多表中的重复记录,这不是所需的结果。使用JPA与Hibernate提供程序的ManyToMany关系不会创建主键
表生成:
client(id,name)
instrument_traded(id,name)
client_instrument_traded(FK client_id, FK instrument_traded_id)
优选表:
client_instrument_traded(PK,FK client_id, PK,FK instrument_traded_id)
实体:
@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;
}
...
}
做一些后研究它看起来像唯一的解决方案是mapping a join table with additional columns使用@OneToMany
@IdClass
和复合主键类,当我不需要额外的列。除了上面代码中包含的解决方案之外,这是唯一的解决方案,它使用@UniqueConstraint
以及@ManyToMany
映射中的两个外键列?对于像这样的常见场景所需的工作量似乎有点荒谬。谢谢!
http://stackoverflow.com/questions/1212058/how-to-make-a-composite-primary-key-java-persistence-annotation/6344626#6344626 – steveeen 2011-06-14 14:14:39
还值得检查,如果你意外地没有添加一个记录两次,这发生在我身上,所以'list.add(x); list.add(x);'结果在列表中重复。 – CsBalazsHungary 2014-10-30 15:58:57