Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA-为什么使用@JoinColumn?_Java_Jpa_Eclipselink - Fatal编程技术网

Java JPA-为什么使用@JoinColumn?

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

我将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;
    }




}

如果我删除
@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);