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。 此解决方案未经优化,将生成一些额外的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() {
    ...
}

映射理想地应该始终在双向关系的父方(公司类)中使用注释,在这种情况下,它应该在公司类中指向Child类(Branch类)的成员变量'company'

注释@JoinColumn用于指定加入实体关联的映射列,此注释可用于任何类(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;
    }


}

孩子班,科

@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;
    }


}
链接地址: http://www.djcxy.com/p/37009.html

上一篇: JPA JoinColumn vs mappedBy

下一篇: What's the difference between JPA and Hibernate?