有什么区别:
@Entity public class Company { @OneToMany(cascade = CascadeType.ALL , fetch = FetchType.LAZY) @JoinColumn(name = "companyIdRef", referencedColumnName = "companyId") private List<Branch> branches; ... }
和
@Entity public class Company { @OneToMany(cascade = CascadeType.ALL , fetch = FetchType.LAZY, mappedBy = "companyIdRef") private List<Branch> branches; ... }
@JoinColumn 可以用于关系的双方。问题是关于侧面使用@JoinColumn(@OneToMany罕见情况)。这里的重点是 物理信息重复 (列名)以及 未优化的 SQL 查询,会产生一些额外的UPDATE语句。
@JoinColumn
@OneToMany
UPDATE
根据文件:
由于在 JPA 规范 中多对一 (几乎)始终是双向关系的 所有者 ,因此一对多关联由@OneToMany(mappedBy=...)
@OneToMany(mappedBy=...)
@Entity public class Troop { @OneToMany(mappedBy="troop") public Set<Soldier> getSoldiers() { ... } @Entity public class Soldier { @ManyToOne @JoinColumn(name="troop_fk") public Troop getTroop() { ... }
Troop``Soldier通过部队属性具有双向的一对多关系。您不必(不得)在mappedBy侧面定义任何物理映射。
Troop``Soldier
mappedBy
要将双向一对多映射,将 一对多作为拥有方 ,您必须删除mappedBy元素并将多设置为一@JoinColumn,insertable并将其设置updatable为 false。这个解决方案没有优化,会产生一些额外的UPDATE语句。
insertable
updatable
@Entity public class Troop { @OneToMany @JoinColumn(name="troop_fk") //we need to duplicate the physical information public Set<Soldier> getSoldiers() { ... } @Entity public class Soldier { @ManyToOne @JoinColumn(name="troop_fk", insertable=false, updatable=false) public Troop getTroop() { ... }