JPA - 为什么要使用@JoinColumn?

时间:2017-08-13 15:24:25

标签: java jpa eclipselink

我在EclipseLink(2.5.2)中使用JPA。

我有以下实体:

[bins, ~, labels] = unique(A);
sums = sparse(labels, 1:numel(A), true)*B;

@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")来实现。

那么,它有什么意义呢?

1 个答案:

答案 0 :(得分:2)

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

JoinColumn还有许多其他属性(只需阅读the documentation),这些属性很有用,因此如果你想使用它们,则需要指定注释。