【问题标题】:How to obtain the bi-directional entity如何获取双向实体
【发布时间】:2022-01-02 17:25:38
【问题描述】:

假设我们有两个实体,EntityA 和 EntityB,这些实体是双向的。我们应该如何获得entityB?向存储库添加新方法是否有意义,例如 findAllByEntityA() 或者我们可以使用 getEntitiesA() getter?

【问题讨论】:

    标签: spring hibernate jpa


    【解决方案1】:

    你可以添加一个新的 spring repo 方法,或者简单地使用 @Getter 注释,或者实现你自己的 getter 方法。

    如果您希望返回 List,您可以使用 findAllByEntityA() 作为获取 EntityB 的一种方式。另一方面,根据命名约定,我希望 getEntitiesA() 用于获取 List 而不是 B。

    这实际上取决于您的双向关系,但基本上所有 jpa 一对一、一对多、多对一、多对多映射都归结为外键约束.

    【讨论】:

      【解决方案2】:

      正如涡轮食品已经说过的那样。有不同种类的映射:

      1. 一对一映射。就像司机和汽车一样:一辆汽车只能由一名司机驾驶,而一名司机只能驾驶一辆汽车。
      2. 多对一映射:就像父亲和孩子一样,一个父亲可以有多个孩子,但一个孩子只能有一个父亲。
      3. 多对多映射:如学生和教师。一个学生可以有多个老师,一个老师可以有多个学生。

      对于一对一映射和多对一映射,您只有一个外键。但是对于多对多映射,您有两个外键,它们是 db-relation-table 的一部分(不能有 jpa-entity)。

      使用 JPA/Hibernate,我们将关系之间的端点分为两种:拥有方(getter 和 setter)和非拥有方(getter 和 setter)。

      对于多对多关系,这是拥有方:

      @OrderBy
      @ManyToMany
      @JoinTable(name="`STUDENT_TO_TEACHER`", joinColumns = {
        @JoinColumn(name="`student_id`", referencedColumnName="`id`", nullable=false),
      }, inverseJoinColumns = {
        @JoinColumn(name="`teacher_id`", referencedColumnName="`id`", nullable=false)
      })
      public Set<Student> getStudents() {
        return this.students;
      }
      

      以及非拥有方:

      @ManyToMany(mappedBy="students")
      public Set<Teacher> getTeachers() {
        return teachers;
      }
      

      现在为什么拥有方和非拥有方很重要:

      Student student = ...
      Teacher teacher = ...
      
      // a bad example:
      student.getTeachers().add(teacher); // STUDENT.TEACHERS IS NOT THE OWNING SIDE
      entityManager.persist(student); // THIS IS NOT POSSIBLE!
      
      // a good example
      teacher.getStudents().add(student); // good
      entityManager.persist(teacher); // possible, teacher have a new student.
      

      除了 Map 关联的 1-1/n-m/1-n 边之外,还有另一种罕见的映射情况。 Map 关联允许您在休眠中使用地图作为吸气剂。我从来没有使用过,所以我无法详细说明这方面的经验。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-24
        • 2016-05-17
        • 1970-01-01
        • 2016-08-19
        • 1970-01-01
        • 2011-09-29
        • 2020-08-29
        • 1970-01-01
        相关资源
        最近更新 更多