gpt4 book ai didi

Hibernate 继承策略及原因

转载 作者:行者123 更新时间:2023-12-02 06:12:06 25 4
gpt4 key购买 nike

我有 3 个非抽象的持久类。 MyClubUser 和 HisClubUser 类继承自 User 类。对于这些类,我为每个子类策略使用一个表,即 @Inheritance(strategy = InheritanceType.JOINED)

我观察到的是,当我对 User 类进行查询时,生成的 SQL 使用左外连接 HisClubUser 和 MyClubUser。为什么 Hibernate 会在我只关心用户的地方[加入其他表]?我的观点是,即使检索到数据,我也无法访问 MyClubUser 或 HisClubUser 中的这些属性,因为返回了 User 实例。此外,与只查询没有左外连接的用户表的查询相比,这是否会导致额外的开销?

谢谢

最佳答案

Hibernate ALWAYS 返回持久实体的实际 类型。如果您存储了“MyClubUser”,它将返回为“MyClubUser”,而不是“User”。这样做的原因很清楚——如果 Hibernate 将“MyClubUser”返回为“User”并且您再次坚持它,您将丢失“MyClubUser”中定义的所有其他属性。

为了做到这一点,Hibernate 需要知道实际类型是什么。对于 InheritanceType.JOINED 策略,找出这一点的唯一方法是检查继承层次结构中的所有表(好吧,从技术上讲,它是当前级别或以下的所有表加上所有当前树分支中高于当前级别的表)。所以,如果你有这样的层次结构:

           Root
/ \
Node1 Node2
/ \
Node11 Node12

如果您尝试从根目录中进行选择,Hibernate 将在所有表上进行外部连接。如果您从 Node1 中选择,Hibernate 将在 Node1 和 Root 上进行内部连接,并在 Node11 和 Node12 上进行外部连接。 Node2 不会被触及,因为它不是 Node1 的后代。

就外部联接开销而言 - 是的,肯定存在开销,但这是您为联接策略付出的代价。您可以使用鉴别器来避免这种情况,但它有其自身的副作用。该开销是否显着取决于层次结构、索引和许多其他事物的深度和分布。听取 KLE 的建议并对其进行分析。

关于Hibernate 继承策略及原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1530657/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com