【发布时间】:2011-03-29 06:54:56
【问题描述】:
我使用 Hibernate 作为提供者创建了两个具有多对多关系的 JPA 实体(客户端、InstrumentTraded)。在让 Hibernate 为 MySQL 生成表之后,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 映射上的两个外键列?像这样的常见场景所需的工作量似乎有点荒谬。谢谢!
【问题讨论】:
-
另外值得检查一下你是否不小心添加了两次记录,这发生在我身上,所以
list.add(x); list.add(x);结果在列表中重复。
标签: hibernate jpa foreign-keys many-to-many primary-key