在此示例中来自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;?它有效吗?
答案 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注释不是必需的。我不确定为什么这么多教程使用这个注释,因为它只会覆盖默认行为。当他们不喜欢默认生成的名称时,自定义命名策略将是更好的选择。
保持简短: