【问题标题】:What does owning side really mean?拥有方的真正含义是什么?
【发布时间】:2014-04-09 12:05:43
【问题描述】:

问题:似乎我没有正确理解 Hibernate *-to-many 映射的逻辑,或者准确地说是拥有方。

示例(一个拥有方的一对多)

@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() {
    ...
}

问题:

  1. 为什么要复制物理信息?以及为什么Troop 表不包含troop_fk 字段(请看上面的示例)
  2. Hibernate 是否忽略映射(非所有者)端的所有查询?
  3. 所有者是否暗示对保存实体的顺序有一些限制?
  4. 下一句是什么意思?

用 inverse="true" 映射关联的一端不会影响 级联的操作,因为它们是正交的概念。

【问题讨论】:

  • 这是 JPA,而不是 Hibernate。这将使搜索信息产生更多结果。如果这是一对多映射,我希望 @OneToMany 端定义 mappedBy 属性而不是连接列。
  • @Gimby 有很多情况。我从 Hibernate 文档中举了这个例子。

标签: java hibernate jpa hibernate-mapping


【解决方案1】:

以下是我对这个概念的一般理解。我不知道
如果这 100% 对应于 HibernateJPA 的使用。

当你有聚合时,你有一个实体(比如Car),它有另一个类型的实体集合(比如Seat)。或者你有一个Student,它有一组Course 实体(他注册的课程)。

现在这个集合可能是拥有的,也可能是不拥有的。

  1. 拥有它意味着它只属于这个父级,父级拥有它。这是一个建模概念。例如,如果您删除父实体,则子实体不应该再存在,它们只是在拥有实体之外没有意义。所以它们也应该被删除。不确定这 CarSeat 是否是拥有集合的最佳示例,因为这些 Seat 实体理论上可能会移动到另一个 Car 实例(例如在维修店中)。

  2. 另一方面,您可能有一个不属于自己的集合。假设Student 有一个它已经注册的Courses 集合。现在,Student 不拥有这个集合,因为显然如果Student 离开大学(所以我们删除他),这并不意味着他的Courses 不复存在。我意识到这是一个多对多的例子。我现在想不出一个好的一对多例子来说明一个不属于自己的集合。

【讨论】:

  • @VolodymyrBakhmatiuk 我不知道他们的答案。
【解决方案2】:

为什么要复制物理信息?以及为什么部队表 不包含 troop_fk 字段(看上面的例子)

在两个实体之间可以有多个关系,例如:组织有多个员工,组织由多个员工领导。只有当关系是双边的时,你才能谈论拥有方和非拥有方。假设这两种关系都是双边的,这意味着每个实体都有两个字段。现在还不清楚 Hibernate 将这些字段映射到两个关系。这就是为什么引入这个概念,将字段配对/分配给相同的关系。

例子:

public class Organisation {
    @OneToMany(mappedBy="employeeOf")
    private List<Employee> employees;
    @OneToMany(mappedBy="leaderOf")
    private List<Employee> leaders;
}

public class Employee {
    @ManyToOne
    @JoinColumn("organisationAsEmployee_id")
    private Organisation employeeOf;
    @ManyToOne
    @JoinColumn("organisationAsLeader_id")
    private Organisation leaderOf;
}

假设在Organisation.employees 中你不会有mappedBy。那么 Hibernate 将不知道该字段是否与 Employee.employeeOf 或 Employee.leaderOf 具有相同的关系或单个独立关系(在 Employee 实体中没有匹配的字段)。 如果它不知道那条信息,例如,它不知道如何连接表,或者它是否必须创建一个新字段。

Hibernate 是否忽略映射(而非所有者)端的所有查询?

Hibernate (JPA) 忽略 NOT-owner 端的 @JoinColumn,但不忽略级联注释。并且 NOT-owner 方必须在 ManyToOne 注释中具有 mappedBy 属性(您没有 => 您现在没有双边关系)。

业主方是否暗示对订单的某些限制? 实体应该被保存?

没有。

【讨论】:

  • 你能提供第一点的例子吗?关于第二个:这是否意味着非所有者方没有级联?
  • 在我的回答中回答了你的两个问题。
猜你喜欢
  • 2017-05-06
  • 2012-03-30
  • 2011-10-10
  • 2012-08-03
  • 2012-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多