JPA @JoinColumn和实体之间的关系

时间:2016-03-01 07:08:33

标签: hibernate jpa

在此示例中来自https://docs.oracle.com/javaee/7/tutorial/persistence-criteria002.htm

@Entity
public class Pet {
    @Id
    protected Long id;
    protected String name;
    protected String color;

    @ManyToOne
    protected Set<Person> owners;
    ...
}

我有两个问题:

1)为什么@ManyToOne下面没有@JoinColumn注释?

2)为什么@ManyToOne中没有限定符(targetEntity = Person.class)?

3)这个@ManyToOne是否意味着许多人映射到一个宠物?如果是这样的话,为什么设置所有者呢?我认为应该只是

@ManyToOne
protected Person owner;

在这个例子中:

@Entity
public class Company {
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "company")
    private List<Branch> branches;
}

@Entity
public class Branch {
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "companyId")
    private Company company;
}

在&#34; @JoinColumn(名称=&#34; companyId&#34;)&#34;,为什么没有&#34; referencedColumnName = id&#34;?它有效吗?

3 个答案:

答案 0 :(得分:2)

看起来不正确

@ManyToOne
protected Set<Person> owners;

应该是

@ManyToMany
protected Set<Person> owners;

@ManyToOne
@JoinColumn
protected Person owner;

因此,@JoinColumn不能与@ManyToMany关联一起使用,因为连接表用于此类关联。无论如何,在适当的时候,我总是使用@JoinColumn来使映射更清晰。

  

为什么@ManyToOne( targetEntity = Person.class)中没有限定符?

可以通过通用Set<Person>计算出来。所以不需要指定。并没有理解映射。

  

在“@JoinColumn(name =”companyId“)”中,为什么不存在“   referencedColumnName = id“?有效吗?

默认情况下,Hibernate使用id的{​​{1}}属性进行关联。这是有效的。

<强>摘要

我看到很多映射都有几十个不必要的注释。这很难理解。请仅使用那些映射更清晰的注释。

答案 1 :(得分:1)

1)为什么@ManyToOne下面没有@JoinColumn注释?

出于同样的原因,id,name和color没有@Column注释。该字段的名称与DB表中的名称相同。发生这种情况时,您不需要包含@Column或@JoinColumn注释(以及@Table)

2)为什么@ManyToOne中没有限定符(targetEntity = Person.class)?

您已经说过哪个是具有Set的目标实体。

在“@JoinColumn(name =”companyId“)”中,为什么不存在“referencedColumnName = id”?有效吗?

你没有这样做,在公司@Entity中,我猜你在某个领域有一个@Id注释。

答案 2 :(得分:0)

JoinColumn注释不是必需的。我不确定为什么这么多教程使用这个注释,因为它只会覆盖默认行为。当他们不喜欢默认生成的名称时,自定义命名策略将是更好的选择。

保持简短:

  1. 没有JoinColumn注释,因为它是可选的,有人决定不使用它。也许他想要默认行为。
  2. 仅当相关实体与模型中的实体不同时,才需要TargetEntity。 (也许是另一种类的实现)