仅使用ID的双向映射

时间:2015-12-17 12:23:16

标签: java jpa database-design bidirectional

我有两个班,父母和孩子

@Entity
class Parent {

     @Id 
     private long id;

     @OneToMany
     private List<Children> children;

}

@Entity
class Children {

      @Id
      private int id;

      @ManyToOne
      private Parent parent; //Normal bi-directional mapping
                   // OR 
      private long parentId; //just keeping reference to parent (kind of bi-directional)
}

要求

我确实需要双向导航访问。但是从孩子到父母的导航访问并不重要。它将偶尔用于做一些操作。从父级到子级的导航访问在应用程序层和核心业务逻辑的一部分中非常重要。

  1. 保持双向映射在这里有意义吗?
  2. 如果是,那么只保留孩子父母的身份吗?如果我将整个父实体映射到孩子身上,我担心会遇到的复杂问题。
  3. 据我所知,映射实体或只是父代的Id不会对数据库存储产生任何影响,因为在这两种情况下数据库只保留一列(在映射实体的情况下作为外键) ,以及保持只是id的正常列-parentId。

    但是,如果我明确告知数据库有关两个实体之间的双向关系,我可能会获得一些性能吗?

    PS: 忽略缺少的注释和其他参数以完全按语法完成映射。问题不在于“我应该如何”,而是“我应该”?

1 个答案:

答案 0 :(得分:0)

您通常使用Hibernate做的是:

Child.class

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "parent_id")
private Parent parent;

即,您只加入id,但分别存储整个父对象

Parent.class

@OneToMany(fetch = FetchType.LAZY, mappedBy = "parent")
private List<Children> children = new ArrayList<Children>();

回答你的第一个问题:是的,双向映射是有意义的,因为显然存在连接。

编辑:虽然映射并不完美,因为孩子通常没有一个父母,而是两个。 ;)