在休眠中使用继承时如何仅获取一种实体?

Posted

技术标签:

【中文标题】在休眠中使用继承时如何仅获取一种实体?【英文标题】:How to fetch only one kind of entities while using inheritance in hibernate? 【发布时间】:2013-01-09 13:23:11 【问题描述】:

我有这两个实现单表继承策略的类:

@Entity
@Table(name = "tableA")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "type")
@DiscriminatorValue("A")
class A 
    ...


@Entity
@DiscriminatorColumn(name = "type")
@DiscriminatorValue("B")
class B extends A 
    ...

当我创建一个查询来获取所有 A 实体时,它也会给我带来 B 实体。如何只获取类型 A 的实体?

【问题讨论】:

你可以创建一个通用的抽象基类,并使 A 和 B 都扩展基类。 描述符列(“类型”)是否定义为超类中的@Basic?如果是,你可以选择它也许... 或者如果支持 JPA2.0,您也可以使用 SELECT a FROM A a WHERE TYPE(a) = A 我们仍然使用 JPA 1。我偶然发现了一些类似的建议:SELECT a FROM A a WHERE a.class = "A"。事实证明,我最终使用了@guido 建议的解决方案。 @guido,请在您的第一条评论中发布答案,我会接受。 【参考方案1】:

您可以创建一个通用的抽象基类并让 A 和 B 都扩展基类,例如:

@Entity
@Table(name = "tableA")
@DiscriminatorColumn(name="`type`")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
abstract class Base 
    ...


@Entity
@DiscriminatorColumn(name = "type")
@DiscriminatorValue("A")
class A extends Base 
    ...


@Entity
@DiscriminatorColumn(name = "type")
@DiscriminatorValue("B")
class B extends Base 
    ...

(请注意,SINGLE_TABLE 是默认策略,因此可以省略注释参数)。

或者如果支持 JPA2,您可以使用:

SELECT a FROM A a WHERE TYPE(a) = A

【讨论】:

以上是关于在休眠中使用继承时如何仅获取一种实体?的主要内容,如果未能解决你的问题,请参考以下文章

我可以在休眠中使用单表继承从扩展实体中选择所有超级对象吗?

获取休眠中实体的最后一个ID

使用计数和连接从休眠的实体中获取行

如何在休眠中不继承 Id GeneratedValue(在子类中禁用 @GeneratedValue)

传递给持久化的休眠分离实体

将对象保存到数据库时使用休眠