2017-08-13 97 views
0

我正在使用JPA和EclipseLink(2.5.2)。JPA - 为什么使用@JoinColumn?

我有以下实体:

@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已经实现的。

那么,它有什么意义呢?

+1

如果没有列名称,可以说“使用FK而不是连接表”。使用列名称,指定此FK列名称而不是JPA默认列名称, –

+1

PS您似乎忘记将“@ OneToMany”添加到“消费者”。虽然JPA提供者可能需要查看该注释(因为它可以通过自省获得该信息),但它是JPA规范的一部分,它意味着您必须指定'mappedBy'来使其具有双向性 –

回答

2

没有什么区别,因为在JPA规范中指定的映射ManyToOne的默认方式是使用连接列(例如,与连接表相反),并使用您为您选择的名称加入列,并引用目标实体的ID。如果您想要一个不同的列名称或引用另一列,则注释是必要的。

JoinColumn还有许多其他的属性(只是读the documentation)可以是有用的,因此如果你想使用它,需要指定注释。