来自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,这应该被定义。