【问题标题】:Using TYPE to select only specific class with Inheritance.table_per_class stategy使用 TYPE 仅选择具有 Inheritance.table_per_class 策略的特定类
【发布时间】:2019-04-28 09:42:23
【问题描述】:

想象以下场景,我们使用继承策略 TABLE_PER_CLASS 和 Template 作为超类,而 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进行继承

有没有办法只获取模板?

【问题讨论】:

    标签: java hibernate jpa jakarta-ee jboss


    【解决方案1】:

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

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

    JPA 2.1 规范中提到了 TABLE_PER_CLASS:

    在此版本中支持 TABLE_PER_CLASS 映射策略是可选的。

    这也意味着支持可能只是部分的:像 TYPE 支持没有实现。

    还有一些帖子表明不仅 Hibernate 会受到这种影响,请参阅(有些很老,但仍然如此),例如:this 和 this。

    所以作为一个结论:

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

    在 Hibernate 中,您还可以尝试使其与 @DiscriminatorColumn 一起使用并将列添加到 Template 实体,但我个人认为这不值得。

    【讨论】:

    • 感谢您的信息:3 很遗憾,这将允许很多操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 2013-06-18
    • 1970-01-01
    • 2014-05-16
    • 2023-03-17
    • 2012-09-18
    相关资源
    最近更新 更多