当前位置: 首页 > 面试题库 >

休眠继承策略及其原因

施博文
2023-03-14
问题内容

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

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

谢谢


问题答案:

hibernate 总会 返回持久实体的 实际 类型。如果您已存储“ MyClubUser”,它将以“ MyClubUser”的形式返回,而不会以“
User”的形式返回。原因很明确-如果Hibernate将“ MyClubUser”作为“用户”返回,而您再次坚持下去,则会丢失“
MyClubUser”中定义的所有其他属性。

为了做到这一点,Hibernate需要知道实际的类型是什么。对于InheritanceType.JOINED策略发现的唯一方法是检查 所有
在你的继承层次结构表(当然,在技术上它是等于或低于当前水平的所有表再加上目前的树枝高于目前水平的所有表)。因此,如果您具有类似以下的层次结构:

           Root
          /   \
      Node1  Node2
      /   \
   Node11 Node12

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

就外部连接开销而言-
是的,肯定有开销,但这就是您为连接策略付出的代价。您可以使用区分符来避免这种情况,但这有其自身的副作用。该开销是否显着取决于层次结构的深度和范围,索引以及许多其他事情。听取KLE的建议并进行介绍。



 类似资料:
  • 问题内容: 我该如何决定使用哪个? , , , 。 我阅读了https://www.hibernate.org/hib_docs/v3/api/org/hibernate/cache/CacheConcurrencyStrategy.html,但没有足够详细地解释。 问题答案: 在Hibernate文档确实在他们定义了很好的工作: 19.2.2。策略:只读 如果您的应用程序需要读取而不是修改持久类

  • 主要内容:连接策略示例在连接策略中,为每个实体类生成一个单独的表。 每个表的属性都与主键连接。 它消除了字段字重复的可能性。 以下语法表示连接的策略: - 连接策略示例 在这个例子中,我们将员工分为活跃员工和退休员工。 因此,子类和继承父类的和字段。 现在,按照以下步骤创建JPA项目 - 第1步: 在包下创建一个根实体类并指定所有必需的属性和注释。 文件:Employee.java - 第2步: 在包下创建实体类(它是

  • 主要内容:单表策略示例单表策略是定义继承实现的最简单有效的方法之一。 在这种方法中,多个实体类的实例仅作为属性存储在单个表中。 以下语法表示单个表策略 - 单表策略示例 在这个例子中,我们将员工分为活跃员工和退休员工。 因此,子类和继承父类的和字段。 现在,按照以下步骤创建JPA项目 - 第1步: 在包下创建一个根实体类并指定所有必需的属性和注释。 文件:Employee.java - 第2步: 在包下创建实体类(它是

  • 主要内容:连接策略示例在按类表策略中,为每个子实体类生成一个单独的表。 与连接策略不同,在按类表策略中不会为父实体类生成单独的表。 以下语法表示按类表策略 - 连接策略示例 在这个例子中,我们将员工分为活跃员工和退休员工。 因此,子类和继承父类的和字段。 现在,按照以下步骤创建JPA项目 - 第1步: 在包下创建一个根实体类并指定所有必需的属性和注释。 文件:Employee.java - 第2步: 在包下创建实体类(

  • 由于某些原因,我无法使Hibernate继承策略=InheritanceType.Joint&onetoMany的组合工作。以下是这些实体。 @实体

  • 在编程中,我们经常会想获取并扩展一些东西。 例如,我们有一个 user 对象及其属性和方法,并希望将 admin 和 guest 作为基于 user 稍加修改的变体。我们想重用 user 中的内容,而不是复制/重新实现它的方法,而只是在其之上构建一个新的对象。 原型继承(Prototypal inheritance) 这个语言特性能够帮助我们实现这一需求。 [[Prototype]] 在 Java