【问题标题】:How to fetch many-to-many relationship entity如何获取多对多关系实体
【发布时间】:2015-12-12 00:33:40
【问题描述】:

我有以下表结构

TABLE1
  T1_ID
  T1_Col1

TABLE2
  T1_ID
  T3_ID

TABLE3
  T3_ID
  T3_COL1

Table1Table3Table2 的中间表连接。现在我只有T1_ID,我想从Table3 中获取与T1_ID 关联的所有行。一个简单的 SQL 查询将是

select T1.*, T3.* 
from TABLE1 T1, TABLE T2, TABLE3 T3
where T1.T1_ID = T2.T1_ID
and T2.T3_ID = T3.T3_ID

那么我如何在 hibernate/jpa 中做到这一点...我还没有为Table1Table2Table3 编写我的实体类。我想将此查询作为Table1 的一部分执行,这样我就可以编写一个方法,比如entity.fetchAssociatedTable3()。我能想到的最简单的方法是在fetchAssociatedTable3 我可以像上面提到的那样放置自定义查询。但是由于我使用的是hibernate/jpa,所以我想知道是否有更好的方法来做到这一点。

更新 显然,我的问题还不够清楚。我想做一些用户 Dragan Bozanovic 提到的事情。但是,我想知道的是

  1. 我将如何编写Table1 实体?我的意思是我会在列等上添加什么注释,这将使 hibernate/jpa 了解该列通过Table2Table3 列相关

  2. 我猜如果问题1得到了回答,那么getEntity3s()方法就很难写了。但是,如果(对于菜鸟)有什么我需要知道的,我将不胜感激。

【问题讨论】:

    标签: java mysql hibernate postgresql jpa


    【解决方案1】:

    假设您将在Entity1(映射到TABLE1)和Entity3(映射到TABLE3)之间建立多对多关联,您可以:

    1) 通过 id 读取 Entity1 并从中获取所有 Entity3s:

    Entity1 entity1 = entityManager.find(Entity1.class, entity1Id);
    Collection<Entity3> entity3s = entity1.getEntity3s();
    

    2) 或者,执行 JPQL 查询以获取 Entity3s 而不加载 Entity1 实例:

    select distinct e3 from Entity3 e3 join Entity1 e1 where e1.id = :entity1Id
    

    【讨论】:

    • 这就是我想要做的。但我的问题是 1:我将如何编写 getEntity3s() 方法 ... 2:我将如何编写 entity1 类?我将如何放置映射、加入详细信息等?
    • 这是一个广泛的主题,需要在答案中涵盖。您应该阅读 Hibernate/JPA 教程或书籍。
    【解决方案2】:

    您需要做的第一件事是在使用 ORM 工具(Hibernate/JPA)时停止考虑表格。您对类及其关系进行建模,并让 ORM 工具以声明方式帮助映射。您的连接表只是用于在两个实体之间创建多对多关系。因此,就类而言,您将只有 Entity1 和 Entity3。您不会创建表示连接表的类(当然,除非您希望它具有除外键之外的其他属性,在这种情况下,它本身就有资格成为实体类)。然后您可以使用@Dragan 建议的任一方法,即按主键加载或使用显式 HQL/JPQL。

    【讨论】:

    • 他想知道如何处理这种情况,而不是如何使用 orm。他可能继承了遗留代码,并且无法更改架构。
    • @LeBaton - 谁在这里谈论更改架构。我只是强调需要从 ORM 的角度来看待它,因为他正在尝试使用 ORM 完成他的任务。如果你有一个遗留模式,你会尝试尽可能地通过 ORM 使用映射使数据库建模与对象建模相匹配。 “M”代表 ORM 中的映射。对于提出的问题 - 使用 ORM 工作时,连接表有点微不足道,因为它被透明地用于维护关系。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-25
    • 2017-01-25
    • 2015-07-11
    • 2017-01-28
    • 2021-05-25
    相关资源
    最近更新 更多