当前位置: 首页 > 知识库问答 >
问题:

当使用JPA@OneTomany关联时,@JoinColumn和mappedBy之间有什么区别

胡彭亮
2023-03-14

两者之间有什么区别:

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

共有2个答案

邢灿
2023-03-14

@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设置为insertable,将updatable设置为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() {
    ...
}
上官琦
2023-03-14

注释@joincolumn表示此实体是关系的所有者(即:对应的表有一个列,该列带有引用表的外键),而属性mappedby表示此边的实体是关系的反面,并且所有者驻留在“Other”实体中。这也意味着您可以从用“mappedby”(完全双向关系)注释的类中访问另一个表。

特别是,对于问题中的代码,正确的注释如下所示:

@Entity
public class Company {
    @OneToMany(mappedBy = "company",
               orphanRemoval = true,
               fetch = FetchType.LAZY,
               cascade = CascadeType.ALL)
    private List<Branch> branches;
}

@Entity
public class Branch {
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "companyId")
    private Company company;
}
 类似资料:
  • 问题内容: 之间有什么区别? 和 问题答案: 可以在关系的两边使用。 现在的问题是关于使用上侧(极少数情况下)。这里的重点是 物理信息重复 (列名)以及 未优化的SQL查询,这会产生一些其他语句。 根据文件: 由于 多对一的 (几乎)总是 所有者侧 的在JPA规范的双向关系中,一对多关联是通过注解 通过troop属性具有双向的一对多关系。您不必(不必)在侧面定义任何物理映射。 要 以一对多方为拥有

  • 我有三个班,站点,GoupIP和IP 一个站点有一个或多个抱怨。GroupIP有一个或多个IP。 代码如下: 地点 群居 IP 在GroupIp课堂上,我得到: 在属性“ips”中,“映射者”值“groupip”无法解析为目标实体上的属性。 我的代码出了什么问题??

  • 两者之间有什么区别: 而且

  • 我刚开始冬眠。我有一个与帐户和交易之间的双向映射的单人关系。我没有在这两个类中使用@JoinColumn,而在非所有者Account类中使用@MappedBy。一切正常。使用内存数据库中的H2,在事务表中创建新的联接列。那么@JoinColumn在OneToMany关系中有什么用--它仅仅用于单向映射吗?下面是代码。我还阅读了使用JPA@OneTomany关联时@JoinColumn和mapped

  • 问题内容: 和之间的确切区别是什么? 您使用的列是外键的一部分。典型的列可能看起来像(例如,在具有附加属性的联接表中): 如果我也将列也提升为a / PK(又称为识别关系)会怎样?由于该列现在是PK,因此我必须用标记: 现在的问题是: 是+ 上面一样? 如果没有,那有什么用? 问题答案: 如果我也将列也提升为a / PK(又称为识别关系)会怎样?由于该列现在是PK,因此必须使用@Id(…)对其进行

  • 问题内容: 单向关联和双向关联有什么区别? 由于在数据库中生成的表都是相同的,所以我发现的唯一区别是双向关联的每一侧都有一个引用,而单向则没有。 这是单向关联 双向关联 区别在于该组是否持有用户的参考。 所以我想知道这是否是唯一的区别?哪个推荐? 问题答案: 主要区别在于,双向关系提供了双向导航访问,因此您无需显式查询即可访问另一侧。此外,它还允许您在两个方向上应用级联选项。 请注意,导航访问并不