gpt4 book ai didi

java - JPA/Hibernate - 父类(super class)查询时如何确定子类类型?

转载 作者:搜寻专家 更新时间:2023-11-01 02:32:08 24 4
gpt4 key购买 nike

我刚刚注意到 Hibernate 中的这种行为并发现它有点令人惊讶(以一种受欢迎的方式)。我有一个名为 SyncItem 的实体类型,它充当许多其他实体的父类(super class)。继承策略设置为 InheritanceType.JOINED,因此父类(super class)中的所有字段都有一个表,子类表只包含子类中添加的任何字段,加上返回的引用父类(super class)表。

例如,我的 SyncItem 表如下所示:

mysql> describe syncItems;
+------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+----------------+
| id | bigint(20) | NO | PRI | NULL | auto_increment |
| hidden | bit(1) | NO | | NULL | |
| title | varchar(255) | NO | | NULL | |
| createDate | datetime | NO | | NULL | |
| modifyDate | datetime | YES | | NULL | |
| deleteDate | datetime | YES | | NULL | |
+------------+--------------+------+-----+---------+----------------+

如果我有一个 Property 子类,它可能会得到如下表格:

mysql> describe properties;
+--------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+--------------+------+-----+---------+-------+
| syncId | bigint(20) | NO | PRI | NULL | |
| propertyCode | varchar(255) | YES | | NULL | |
+--------------+--------------+------+-----+---------+-------+

现在我有大约十几个不同的子类,令我惊讶的是我有这样的查询:

@NamedQuery(
name="SyncItem.findByTitle",
query="SELECT s FROM SyncItem s WHERE s.title = :title")

当我写这篇文章时,我预计因为我是从 SyncItem 中选择的,所以我只会取回父类(super class)表中包含的信息(即我会得到一个 SyncItem 实例,而不是 Property 实例)。然而,当我运行它时,我发现查询实际上返回了正确的子类实​​例。这很好,因为它使许多事情更容易实现。

但是,我想知道,JPA/Hibernate 是如何设法带回子类的?它无法知道给定的标题将映射到 Property 而不是其他东西,据我所知它没有从 syncItems 到的直接映射properties(它必须从 properties 映射回 syncItems)。执行此查询时,它是否与每个子类表进行连接?如果是这样,那不会使查询变得非常昂贵吗?

是的,只是想知道幕后发生了什么。

最佳答案

是的,它为每个子表执行一个 Join。它很昂贵,但您可以使用其他 2 种策略中的任何一种来映射继承。

Here您可以在其中找到引用:

the joined strategy is often the slowest of the inheritance models. Retrieving any subclass requires one or more database joins, and storing subclasses requires multiple INSERT or UPDATE statements

3 种可用策略中的每一种都有其自身的优点和缺点(如果您更喜欢节省空间而不是时间,或者两者之间的折衷)。选择还取决于您将更频繁地对这些表执行的操作类型。在我粘贴的引用资料中,您会找到对每个引用资料的相当好且简单的解释。

关于java - JPA/Hibernate - 父类(super class)查询时如何确定子类类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6658490/

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