来自superClass的JPA OneToMany协会

我正在尝试映射超类LendingLine和子类Line和BlockLine的inheritance。 LendingLine与Lending有一个ManyToOne关联。

当我尝试从数据库中获取LendingLines而没有inheritance时,它可以正常工作。 该协会也有效。 但是当我添加inheritance时,Lending中的lendingLines是空的。 我也无法通过inheritance从DB获取任何LendingLines。

有谁能够帮我?

(对不起,解释不好)

提前致谢!

LendingLine:

@Entity @Inheritance(strategy=InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(name="TYPE") @DiscriminatorValue(value="Line") @Table(name = "LendingLine") public class LendingLine { ... public LendingLine(){} @ManyToOne(cascade = CascadeType.ALL,fetch = FetchType.EAGER, targetEntity=Lending.class) @JoinColumn(name = "LendingId") private Lending lending; ... 

贷款:

 @Entity @Table(name = "Lending") public class Lending { ... public Lending(){} @OneToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER, mappedBy = "lending") private List lendingLines; ... 

BlockDate:

 @Entity @DiscriminatorValue(value = "BlockLine") public class BlockLine extends LendingLine { public BlockLine(){ } } 

LendingLineRepository:

此类仅从db读取,因为db是由另一个应用程序(C#)创建的,其中对象已添加到db。

 public class LendingLineRepository extends JpaUtil implement LendingLineRepositoryInterface { @Override protected Class getEntity() { return LendingLine.class; } @Override public Collection findAll() { Query query = getEm().createQuery("SELECT l FROM LendingLine l"); System.out.println(query.getResultList().size()); return (Collection) query.getResultList(); } 

表贷款线:

在此处输入图像描述

根据您的需要选择您的超类类型:

混凝土类

public class SomeClass {}

当您想要查询它时以及使用new运算符进一步逻辑时,将您的超类定义为具体类。 您将始终能够直接保留它。 在鉴别器列中,该实体具有自己的名称。 查询时,它只返回自身的实例而没有子类。

抽象类

public abstract class SomeClass {}

当您想要查询它时,将您的超类定义为抽象类,但实际上并不使用new运算符,因为所有处理的逻辑都是由它的子类完成的。 这些类通常由其子类保留,但仍可以直接保留。 U可以预定义任何子类必须实现的抽象方法(几乎像一个接口)。 在鉴别器列中,该实体将没有名称。 查询时,它会返回所有子类,但没有其他定义的信息。

MappedSuperclass

@MappedSuperclass public abstract class SomeClass {}

无法查询具有@MappedSuperclass接口的超类。 它为其所有子类提供预定义逻辑。 这就像一个界面。 您将无法持久保存映射的超类。

有关详细信息,请参阅: JavaEE 7 – 实体inheritance教程


原始信息

你的SuperClass LendingLine需要定义一个@DiscriminatorValue ,因为它可以被实例化并使用现有的db-sheme,这应该被定义。