小编典典

Spring Data JPA(Hibernate):如何仅使用抽象超类中的字段来检索具体实体?

hibernate

考虑以下层次结构,其中包含实体WidgetAWidgetB扩展了抽象Widget超类:

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Widget implements Serializable  {

    @Column(name="serialNumber", length=64, nullable=false, unique=true)
    private String serialNumber;
    ...

@Entity
public class WidgetA extends Widget implements Serializable  {
...

@Entity
public class WidgetB extends Widget implements Serializable  {
...

我需要通过搜索Widget
serialNumber,但我不知道我在运行时要搜索的Widget的具体类型。什么是正确的搜索窗口小部件的方式,serialNumber例如,如果serialNumber是的WidgetA,则WidgetA返回的实例,依此类推?

我试图findyBySerialNumber()WidgetDAO中使用a
,但收到一个错误消息,告诉我我无法实例化一个抽象类,这很有意义,但是我认为持久性提供程序会知道如何在具体的子实体表中查找和返回正确的实例。我可以做到吗?

我正在使用“ Spring Data JPA”,因此Widget DAO非常简单:

public interface WidgetDAO extends JpaRepository<Widget, Long> {
    public Widget findBySerialNumber(String serialNumber);
}

阅读 281

收藏
2020-06-20

共1个答案

小编典典

似乎您没有为窗口小部件层次结构明确指定区分符。我认为您可以尝试明确定义它,因为Spring
Data会操纵字节码来生成查询,因此我怀疑SpringData需要明确定义那些值。

另外,在子类中,您需要指示每个子类的鉴别值。

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name="WIDGET_TYPE")
public abstract class Widget implements Serializable  {

    @Column(name="serialNumber", length=64, nullable=false, unique=true)
    private String serialNumber;
    ...

--

@Entity
@DiscriminatorValue("A")
public class WidgetA extends Widget implements Serializable  {
...

--

@Entity
@DiscriminatorValue("B")
public class WidgetB extends Widget implements Serializable  {
...
2020-06-20