gpt4 book ai didi

java - 使用 TYPE 通过 Inheritance.table_per_class 策略仅选择特定类

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

想象一下以下场景,我们使用继承策略 TABLE_PER_CLASS 和 Template 作为父类(super class),而 Product 作为子类。

模板:

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@Table(name = "Templates")
@NamedQuery(name = "getAllTemplates", query = "SELECT t FROM Template t")
public class Template implements Serializable { ...}

产品:

@Entity
@Table(name = "Product")
public class Product extends Template implements Serializable { ... }

在这种情况下,我什至认为我的 DB 中有 2 个模板和 1 个产品。每当我调用模板namedQuery时,我都会检索产品和模板。

我尝试做这样的事情:

SELECT t FROM Template t WHERE TYPE(t) = Template

但是它返回以下错误: 类没有描述符,或者描述符不使用继承或者使用ClassExtractor进行继承

有没有办法只获取模板?

最佳答案

使用 TABLE_PER_CLASS 时,TYPE 运算符对子类不起作用。似乎没有关于将 TYPE 与 TABLE_PER_CLASS 一起使用的明确信息。

但是有很多帖子说这种策略效率低下,并不完全推荐使用。

JPA 2.1 规范对 TABLE_PER_CLASS 进行了说明:

Support for the TABLE_PER_CLASS mapping strategy is optional in this release.

这也意味着支持可能只是部分的:例如未实现 TYPE 支持。

还有一些帖子表明,不仅 Hibernate 受到此问题的困扰,请参阅(有些很旧,但仍然如此),例如:thisthis .

结论是:

  • 如果可能,更改为 SINGLE_TABLE 或 JOINED 策略
  • 接受它

在 Hibernate 中,您还可以尝试让它与 @DiscriminatorColumn 一起工作。并将该列添加到 Template实体,但我个人认为这不值得付出努力。

关于java - 使用 TYPE 通过 Inheritance.table_per_class 策略仅选择特定类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53486301/

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