考虑以下层次结构,其中实体WidgetAWidgetB扩展了抽象Widget父类(super class):

@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  {
...

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

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

我正在使用“Spring Data JPA”,因此Widget DAO非常简单:
public interface WidgetDAO extends JpaRepository<Widget, Long> {
    public Widget findBySerialNumber(String serialNumber);
}

最佳答案

似乎您没有为窗口小部件层次结构明确指定区分符。我认为您可以尝试明确定义它,因为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  {
...

09-25 21:39