2017-08-13 98 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)可以是有用的,因此如果你想使用它,需要指定註釋。