【问题标题】:Does hibernate load all the database records? anyway to control it?hibernate 会加载所有数据库记录吗?反正要控制吗?
【发布时间】:2026-01-10 04:00:01
【问题描述】:

我想知道 hibernate 是如何工作的...假设我有三个实体类:A、B 和 C。

我知道已经知道以下事实:

  • 我不会对 B 对象执行任何选择语句。
  • 我将在 B 中插入(通过调用 persist())数十万条新行。
  • 我将选择和更新 A 对象数百次。
  • 我不会对 C 对象做任何操作。
  • 数据库中以前保存了数十万个 C 对象。
  • 在其他会话中,我将重复完全相同的操作。

因此,数据库将变得越来越大,我注意到在 B 对象上调用 persist() 变得越来越慢。

我的问题是:

  1. hibernate 会加载数据库中的所有对象吗?所有 A、B 和 C 对象?
  2. 如何查看 hibernate 为从数据库加载对象所做的操作?
  3. 我可以控制加载操作吗?事实上,我不想加载 C 对象,也不想加载 B 对象。
  4. 如何查看和控制数据库中实际加载为实体对象的记录?
  5. 如果对B的id的唯一性进行验证操作 对象,我可以在日志文件中看到此验证吗?
  6. 是否可以停用验证操作以加速 B 对象的 persist() 操作?事实上,我可以在我的代码中管理 id 的唯一性,我不想让 hibernate 验证它。

【问题讨论】:

    标签: hibernate persistence persist


    【解决方案1】:

    1) 不,只有必需的

    2) 您可以配置休眠日志以显示执行的 SQL 和 DML 语句

    3) 您只加载选定的对象。另外,您可以为关联指定 EAGER 或 LAZY

    4) 你为什么要这样做?这是休眠任务。

    5) 如果一个 ID 不是唯一的,那么它就不是一个 ID。期间。

    6) Hibernate 只是发送到 DB,DB 执行大部分检查。如果您想“调整” Hibernate 以提高性能,请不要将 Hibernate 用于该操作。

    【讨论】:

    • 谢谢 Juan,关于第 4 点,现在不需要这样做,因为您向我保证只加载选定的对象。我所有的联想都是懒惰的。为什么您认为随着数据库变得越来越大,调用persist() 变得越来越慢?在日志文件中,我只看到了 select、update、insert 语句,有什么方法可以查看 hibernate 何时执行他的隐式自动 flush() 和 commit() 操作?
    • 这听起来是一个数据库问题,获取一个调优工具并记录其操作的性能。
    最近更新 更多