Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 来自超类的JPA OneToMany关联_Java_Jpa_Inheritance_Many To One - Fatal编程技术网

Java 来自超类的JPA OneToMany关联

Java 来自超类的JPA OneToMany关联,java,jpa,inheritance,many-to-one,Java,Jpa,Inheritance,Many To One,我试图从超类LendingLine和子类Line和BlockLine映射继承。LendingLine与贷款有着多方面的联系 当我尝试在没有继承的情况下从数据库中获取借出行时,效果很好。该协会也在运作。但是当我添加继承时,Lending中的lendingLines是空的。我也无法通过继承从DB获得任何借出行 有人能帮我吗 对不起,解释得不好 提前谢谢 出借行: 贷款: LendingLineRepository: 此类仅从数据库中读取,因为数据库是由另一个应用程序C创建的,在该应用程序中,对象被添

我试图从超类LendingLine和子类Line和BlockLine映射继承。LendingLine与贷款有着多方面的联系

当我尝试在没有继承的情况下从数据库中获取借出行时,效果很好。该协会也在运作。但是当我添加继承时,Lending中的lendingLines是空的。我也无法通过继承从DB获得任何借出行

有人能帮我吗

对不起,解释得不好

提前谢谢

出借行:

贷款:

LendingLineRepository:

此类仅从数据库中读取,因为数据库是由另一个应用程序C创建的,在该应用程序中,对象被添加到数据库中

public class LendingLineRepository extends JpaUtil implement LendingLineRepositoryInterface {
@Override
protected Class getEntity() {
    return LendingLine.class;
}

@Override
public Collection<LendingLine> findAll() {
    Query query = getEm().createQuery("SELECT l FROM LendingLine l");
    System.out.println(query.getResultList().size());
    return (Collection<LendingLine>) query.getResultList();
}
表借出行:


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

混凝土类 公共类SomeClass{}

当您想要查询超类以及使用新运算符进行进一步逻辑时,请将超类定义为具体类。你总是能够直接坚持下去。在鉴别器列中,该实体有自己的名称。查询时,它只返回自身的实例,不返回子类

抽象类 公共抽象类SomeClass{}

当您想要查询超类时,请将其定义为抽象类,但实际上不要使用新的运算符,因为所有处理的逻辑都是由它的子类完成的。这些类通常由其子类持久化,但仍然可以直接持久化。您可以预定义抽象方法,任何子类都必须像接口一样实现这些方法。在鉴别器列中,此实体将没有名称。当查询它时,它返回自己的所有子类,但没有这些子类的附加定义信息

映射超类 @映射超类 公共抽象类SomeClass{}

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

有关进一步资料:

原始消息
您的超类LendingLine也需要定义@DiscriminatorValue,因为它可以被实例化,并且您使用一个现有的db sheme,在这里应该定义它。

为什么在@OneToMany映射中需要@JoinColumn注释?据我所知,你们是一个双向的借贷关系。为什么在@OneToMany映射中需要@JoinColumn注释?@ujulo我不知道JoinColumn为什么在那里,但我删除了它。但它仍然不起作用。谢谢你的评论!@Entity annotation在Lending中没有丢失吗?@ujulu谢谢,我忘了在我的问题中添加它。你能把你的代码发布到你保存lendingLines列表的地方吗?我想不是这样的。我试过了,但结果没有改变。但是谢谢你的回答!好的,据我所知,您不能在向该实体添加接口@heritation后立即查询LendingLine。是这样吗?你能提供LendingLine plz的表格定义吗?既然您将继承策略定义为单表,那将是最有趣的事情。是的,这是正确的。我从LendingLine添加了表。注意:我不能更改数据库,因为它是由另一个应用程序创建的,提前谢谢!好的,你提供了表格,但不完整。为了澄清实体结构,我们需要更多的信息。从您提供的表中,超类LandingLine似乎是一个抽象类,包含子类BreakLine和Line。选择您的案例,然后根据需要定义您的超类。如果现有的db-sheme是一致的,那么定义jpa实体就不会有问题。
@Entity
@Table(name = "Lending")
public class Lending {
...
public Lending(){}

    @OneToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER, mappedBy = "lending")
private List<LendingLine> lendingLines;
...
@Entity
@DiscriminatorValue(value = "BlockLine")
public class BlockLine extends LendingLine {
public BlockLine(){
}
}
public class LendingLineRepository extends JpaUtil implement LendingLineRepositoryInterface {
@Override
protected Class getEntity() {
    return LendingLine.class;
}

@Override
public Collection<LendingLine> findAll() {
    Query query = getEm().createQuery("SELECT l FROM LendingLine l");
    System.out.println(query.getResultList().size());
    return (Collection<LendingLine>) query.getResultList();
}