Java JPA-为什么使用@JoinColumn?
我将JPA与EclipseLink(2.5.2)一起使用 我拥有以下实体:Java JPA-为什么使用@JoinColumn?,java,jpa,eclipselink,Java,Jpa,Eclipselink,我将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 Lo
@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;
}
}
及
如果我删除@JoinColumn(name=“PRODUCER\u ID”)
,则预期结果几乎没有差异。
所以我想弄清楚它的真正用途
我在互联网上读过各种例子,我知道它的目的是定义用于连接两个表的列,但这已经通过@ManyToOne
实现了
那么,它有什么意义呢?没有区别,因为JPA规范中指定的映射多个One的默认方式是使用联接列(例如,与联接表相反),使用您为联接列选择的名称,并引用目标实体的ID。如果您想要一个不同的列名,或者引用另一列,则需要进行注释
JoinColumn还有许多其他有用的属性(只是读取),因此如果您想使用它们,就需要指定注释。如果没有列名,可以说“使用FK而不是联接表”。使用列名指定此FK列名,而不是JPA默认列名,PS您似乎忘记了将
@OneToMany
添加到“消费者”中。虽然JPA提供者可能需要查看该注释(因为它可以通过内省查看该信息),但提供该注释是JPA规范的一部分,这意味着您必须指定mappedBy
,使其双向
@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);