JPA @JoinColumn和实体之间的关系



在这个例子中来自 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;
}

在"@JoinColumn(name = "companyId")"中,为什么没有"referencedColumnName =id"?有效吗?

看起来不正确

@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(名称="公司ID")"中,为什么没有" 引用列名称 =id"?有效吗?

默认情况下,休眠使用Companyid 属性进行关联。它是有效的。

总结

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

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

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

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

您已经在说哪个是 Set 的目标实体。

在"@JoinColumn(name = "companyId")"中,为什么没有" referencedColumnName =id"?有效吗?

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

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

为了简短起见:

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

最新更新