【问题标题】:Hibernate Mapping association to MapHibernate 映射关联到 Map
【发布时间】:2020-04-14 04:58:49
【问题描述】:

hibernate 的@OneToMany 关联如何与 java.util.Map 类型一起工作?我也使用@MapKey。

它是否首先加载查询结果集并遍历以在其中创建关联对象?

例如; 我有一个实体汽车 我有另一个实体 CarFeatures

汽车与CarFeatures @JoinColumn("carId") 有一个@OneToMany, FetchType.LAZY 关系。还包括一个带有注释@MapKey("KEY")的功能键

当我想在屏幕上列出所有汽车以及列表中的一些功能时。我正在使用 JOIN FETCH 生成查询以选择与汽车关联的所有功能。

检查了查询,似乎查询正在从带有汽车功能的汽车中选择car.* and carfeature.*

但是当汽车列表的数量很大时;加载结果集花费了太多时间。

这就是为什么我试图了解幕后发生的事情?据我所知;

  1. Hibernate 触发查询。
  2. Hibernate 获取 resultSet 结果集中的每一行都包含 car 及其“one”特性。表示一辆车是否有 20 个功能。结果集中每辆车将有 20 行。
  3. 然后休眠创建包括地图在内的汽车对象。在执行此休眠时,会遍历 resultSet 并将每个 CarFeature 与键值放在一起。

我的理解正确吗?如果是这样,我怎样才能有效地选择汽车及其功能?

我打算做的一件事是;跳过特征表并创建一列 Varchar 以手动将特征编组/解组为列表。

【问题讨论】:

    标签: hibernate one-to-many hibernate-mapping


    【解决方案1】:

    hibernate 的@OneToMany 关联如何与 java.util.Map 类型一起工作?我也使用@MapKey。

    无论集合类型如何,Hibernate 都以相同的方式加载所有 @OneToMany 关联。

    它是否首先加载查询结果集并遍历以在其中创建关联对象?

    是的,没错。

    但是当汽车列表的数量很大时;加载结果集花费了太多时间。

    那是因为你没有使用分页。

    检查了查询,似乎查询正在选择 car.* 和 carfeature.* from car join with carfeatures。

    是的,这正是 JOIN FETCH 所做的。它执行连接并投射来自父关联和子关联的所有内容。

    Hibernate 获取 resultSet 结果集中的每一行都包含 car 及其“one”特征。表示一辆车是否有 20 个功能。结果集中每辆车将有 20 行。

    是的。如果您有 N 辆汽车,每辆汽车有 M 个特征,那么结果集将包含 N x M 条记录。

    我的理解正确吗?如果是这样,我怎样才能有效地选择汽车及其功能?

    当然,有办法。只需使用分页,如this article 中所述。

    我打算做的一件事是;跳过特征表并创建一列 Varchar 以手动将特征编组/解组为列表。

    这听起来像是不需要的 hack。只需使用分页,不要仅针对不使用分页的单个查询对架构进行非规范化,因此当然会很慢。

    【讨论】:

    • 再次感谢您的出色回答以及您文章的链接。但是在这个已经完成大量工作的项目中;我没有机会,只能按照你说的方式走。哈克。我唯一的问题;是否可以使用您的类型实用程序将 json 转换为列(varchar)。由于数据库版本不支持 JSON 列类型。
    • 如果您想将 JSON 数据存储在 VARCHAR 中,只需使用 String 实体属性并存储 JSON 字符串表示。
    • 回到远古时代。但这就是现在必须要做的。我总是计划包括一个可重复使用的和尽可能通用的——这不是现在——。最后,这不是产品,而是解决方案和客户特定
    • 如果是客户特定的,则无需担心。如果它是一个产品,那么您必须编写自己的自定义类型来设法将 JSON 保存到 VARCHAR 或 JSON 特定的列中。如果你研究过hibrnate-types 项目,你就会知道怎么做。
    • 谢谢!经历这个; vladmihalcea.com/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-18
    • 2012-02-09
    相关资源
    最近更新 更多