我正在将 JPA 与 EclipseLink (2.5.2) 结合使用。
我有以下实体:
@Entity
@Table(name="Consumer")
public class Consumer implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "PRODUCER_ID")
private Producer producer;
public Consumer() {
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Producer getProducer() {
return producer;
}
public void setProducer(Producer consumesFrom) {
this.producer = consumesFrom;
}
}
和
@Entity
@Table(name="Producer")
public class Producer implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer Id;
private String dataType;
private List<Consumer> consumers = new ArrayList<>();
public Producer() {
}
public Integer getId() {
return Id;
}
public void setId(Integer id) {
this.Id = id;
}
public String getDataType() {
return dataType;
}
public void setDataType(String dataType) {
this.dataType = dataType;
}
}
以及消费者的持久性:
consumer.setProducer(producer);
entityManager.persist(consumer);
如果删除 @JoinColumn(name = "PRODUCER_ID")
,预期结果实际上没有区别。
所以我想弄清楚它的真正用途是什么。
我在互联网上阅读了各种示例,我知道它的目的是定义用于连接两个表的列,但这已经通过 @ManyToOne
实现了。
那么,这有什么意义呢?
最佳答案
没有区别,因为 JPA 规范中指定的映射 ManyToOne 的默认方式是使用联接列(例如,与联接表相反),并使用您为联接选择的名称列,并引用目标实体的 ID。如果您想要不同的列名称,或者引用另一列,则需要注释。
JoinColumn 还有许多其他有用的属性(只需阅读 the documentation ),因此如果您想使用它们,则需要指定注释。
关于java - JPA - 为什么使用@JoinColumn?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45661928/