首页 > 解决方案 > Hibernate findById 查询中的奇怪行为

问题描述

我有一个用例,其中 Hibernate 以一种意想不到的方式运行。我的想法是我有一个具有关联的实体(尽管其中有很多,同时具有多对一和一对多链接),并且我想使用其中一个实体的主键进行 findById 查询。问题是生成的实体没有关联的 manyToOne 实体之一(同样,最大的相关实体就是这种情况)。作为更多上下文,基本实体(用于 findBy 查询的实体)也有几个“自由文本”字段,在 mysql 中映射为 VARCHAR(1000)。在这种情况下奇怪的是:

  1. 此问题仅发生在表条目的小样本中。他们中的 90% 只是毫无问题地检索整棵树
  2. 获取 hibernate 生成的查询并在 mysql 中使用它会导致正确链接的对象(在此连接中检索关联实体的 id)即使对于这个“有问题的”id -> 所以生成的 SQL 是正确的
  3. 有问题的条目在 2 VARCHAR(1000) 列中有一些较长的文本(一个是 ~ 300 个字符,另一个是 ~ 500 个字符)。如果我们将其中一个文本修剪到一定的字符长度,那么对于这个 id 的查询也是成功的。更进一步,如果我们减少另一个“自由文本”字段的字符,我们可以增加相同数量的第一个文本字段的字符,检索仍然会成功。多一个字符,查询将不会检索相关实体。更进一步,优化一些关系(使一些“ToOne”关联变得懒惰)将允许将更多字符添加到“自由文本”字段而不影响检索。

这种情况下的直接解决方案更有可能仔细地重新设计关联以及每次查询检索到多少树,但我对 Hibernate 框架的这种行为更加好奇。它是否对单个提取查询可以返回或水合的数据/对象数量有限制?如果是这样,限制是多少,可以调整吗?

使用的框架:Hibernate 5.3.9、Spring data 2.1.6、Java 8、Mysql 5.7 数据库

谢谢你。

标签: javamysqlspringhibernate

解决方案


推荐阅读