在这个例子中来自 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"?有效吗?
默认情况下,休眠使用Company
的 id
属性进行关联。它是有效的。
总结
我看到很多带有数十个不必要的注释的映射。这是很难理解的。请仅使用那些映射更清晰的注释。
1)为什么@ManyToOne下面没有@JoinColumn注释?
出于同样的原因,id、name 和颜色没有@Column注释。字段的名称与数据库表中的名称相同。发生这种情况时,您不需要包含@Column或@JoinColumn注释(以及@Table)
2)为什么在@ManyToOne( targetEntity = Person.class )中没有限定符?
您已经在说哪个是 Set 的目标实体。
在"@JoinColumn(name = "companyId")"中,为什么没有" referencedColumnName =id"?有效吗?
你不想这样做,在公司@Entity中,我猜你在某个领域有一个@Id注释。
JoinColumn 注释不是必需的。我不确定为什么这么多教程使用此注释,因为它仅覆盖默认行为。当他们不喜欢默认生成的名称时,自定义命名策略将是更好的选择。
为了简短起见:
- 没有 JoinColumn 注释,因为它是可选的,并且有人决定不使用它。也许他想要默认行为。
- 仅当相关实体与模型中的实体不同时,才需要目标实体。(也许是一个类的另一个实现)