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

标签 java hibernate jpa jakarta-ee jboss

想象一下以下场景,我们使用继承策略 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/

相关文章:

java - 在 Spring 计划任务使用的 Bean 上使用 DAO

java - 为什么 Hibernate 在调用 session.save(object) 时会抛出 ClassCastException?

Hibernate:可以不将 SessionFactory 绑定(bind)到 JNDI 名称吗?

postgresql - 不能在只读事务中执行 nextval()

java - 如何在没有 persistence.xml 的情况下配置 Spring?

java - 如何解决 'threads cannot be resolved to a variable'错误?

java - x.y Activity is not a concrete class in manifest 错误信息

java - 在 Android Wear OS(即 CSV)上保存和传输智能 watch 传感器数据的最佳方式是什么?

java - 为什么我的查询或 jpa 查询在 spring 中不起作用

java - 无法启动本地kafka代理