JPA JoinColumn vs mappedBy
有什么区别:
@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
表示这个实体是关系的所有者 (即:对应的表有一个带有被引用表的外键的列),而属性mappedBy
则表示这个实体在关系,并且所有者居住在“其他”实体中。 这也意味着你可以从你用“mappedBy”注解的类(完全双向关系)访问另一个表。
特别是,对于问题中的代码,正确的注释将如下所示:
@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
可以用在关系的两边。 问题是在@OneToMany
方面使用@JoinColumn
(罕见的情况)。 这里的要点是物理信息重复 (列名)以及未优化的SQL查询,这将产生一些额外的UPDATE语句 。
据文件记载 :
由于多对一 (几乎)总是JPA规范中双向关系的所有者端 ,因此一对多关联由@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() { ... }
部队通过部队财产与士兵有双向一对多的关系。 你不必(不能)在mappedBy方面定义任何物理映射。
要将双向一对多映射为一对多的一面 ,必须删除mappedBy元素,并将多个@JoinColumn设置为可插入和可更新为false。 这个解决scheme没有被优化,并会产生一些额外的UPDATE语句。
@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() { ... }
映射的注释理想情况下应该始终在双向关系的父方(公司类)中使用,在这种情况下,它应该在Company类中指向Child类(Branch类)的成员variables“company”
注释@JoinColumn用于指定一个映射列来join一个实体关联,这个注释可以在任何类(Parent或Child)中使用,但理想情况下它只能用于一个方面(无论是在父类还是在Child类中)在这两种情况下)在这种情况下,我用它在分支类中指示外键的双向关系的子方(分支类)。
下面是工作的例子:
父类,公司
@Entity public class Company { private int companyId; private String companyName; private List<Branch> branches; @Id @GeneratedValue @Column(name="COMPANY_ID") public int getCompanyId() { return companyId; } public void setCompanyId(int companyId) { this.companyId = companyId; } @Column(name="COMPANY_NAME") public String getCompanyName() { return companyName; } public void setCompanyName(String companyName) { this.companyName = companyName; } @OneToMany(fetch=FetchType.LAZY,cascade=CascadeType.ALL,mappedBy="company") public List<Branch> getBranches() { return branches; } public void setBranches(List<Branch> branches) { this.branches = branches; } }
孩子class,科
@Entity public class Branch { private int branchId; private String branchName; private Company company; @Id @GeneratedValue @Column(name="BRANCH_ID") public int getBranchId() { return branchId; } public void setBranchId(int branchId) { this.branchId = branchId; } @Column(name="BRANCH_NAME") public String getBranchName() { return branchName; } public void setBranchName(String branchName) { this.branchName = branchName; } @ManyToOne(fetch=FetchType.LAZY) @JoinColumn(name="COMPANY_ID") public Company getCompany() { return company; } public void setCompany(Company company) { this.company = company; } }
我只想补充一点, @JoinColumn
并不总是必须与物理信息位置相关,正如这个答案所暗示的。 即使父表没有指向子表的数据,也可以将@JoinColumn
与@OneToMany
结合使用。
如何在JPA中定义单向的OneToMany关系
单向OneToMany,没有反向ManyToOne,没有连接表
它似乎只在JPA 2.x+
可用。 这对于希望子类只包含父代的ID的情况非常有用,而不是完整的引用。
- hibernateexception:org.hibernate.AnnotationException:没有为实体指定标识符:com..domain.idea.MAE_MFEView
- 为什么我需要configuration数据源的SQL方言?
- Hibernate中左连接和左连接FETCH的区别?
- 在Spring MVC中使用ScrollableResults-backed Stream作为返回types时遇到困难
- 如何从连接表创build多个到多个Hibernate映射的附加属性?
- hibernate oracle序列产生很大的差距
- ORM映射中的“拥有方”是什么?
- 我如何使用Maven获取最新的Hibernate版本?
- 通过注释使用Hibernate UUIDGenerator