想象一下以下场景,我们使用继承策略 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 受到此问题的困扰,请参阅(有些很旧,但仍然如此),例如:this和 this .
结论是:
- 如果可能,更改为 SINGLE_TABLE 或 JOINED 策略
- 接受它
在 Hibernate 中,您还可以尝试让它与 @DiscriminatorColumn
一起工作。并将该列添加到 Template
实体,但我个人认为这不值得付出努力。
关于java - 使用 TYPE 通过 Inheritance.table_per_class 策略仅选择特定类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53486301/