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