当前位置: 首页 > 知识库问答 >
问题:

JPA抽象继承列表

赖淇
2023-03-14

我的代码:

@MappedSuperclass
public abstract class Header {
    public abstract List<Line> getLines();
}

@Entity
public class ChildHeader extends Header{
    @OneToMany
    public List<ChildLine> getLines();
}
 
@MappedSuperclass
public abstract class Line {
    public abstract Header getHeader();
}

@Entity
public class ChildLine extends Line {
    @ManyToOne
    public ChildHeader getHeader();
}

问题:“ChildHeader”中的“error:”getLines()“与“Header”中的“getLines()”冲突;试图使用不兼容的返回类型”

尝试的解决方案:更改列表

新错误:'ChildHeader'中的'getLines()'与'Header'中的'getLines()'冲突;两种方法都具有相同的擦除功能,但都不会覆盖另一种

尝试的解决方案:尝试使用Line[]ChildLine[]代替列表

新错误:“列表/数组必须用@OrderCol列(或@IndexCol列)注释”,但没有排序列。数组的顺序无关紧要,但似乎@OneTo众多或JPA需要一个。

这是不可能的情况。我能做什么?


共有2个答案

徐涵亮
2023-03-14

“这是不可能的情况…”

如果您遵循JLS关于覆盖实例方法的指导,则不会...

如果满足以下所有条件,则在类C中声明或由类C继承的实例方法m将重写在类A中声明的另一个方法m:

...

  • m签名是m签名的子签名(§8.4.2)

...

请特别注意有关方法签名的部分…

两个方法或构造函数,MN,如果它们具有相同的名称,则具有相同的签名,相同的类型参数(如果有)(§8.4.4),并且,在将N的形式参数类型适应M的类型参数之后,相同的形式参数类型...

错误的症结在于您的方法不符合JLS的标准。

·…我能做什么?…“

如果重构了标题类…

public abstract class Header {
    
    public abstract < L extends Line > List< L > getLines( );
}

如果你重构了你的子标题类…

public class ChildHeader extends Header {
    
    @Override
    @SuppressWarnings("unchecked")
    public < C extends Line > List< C > getLines(){ … }
}

然后你可以做我在这个工作示例中演示的…

…
Header header = new ChildHeader( );
  
List< ChildLine > lines = header.getLines( );
  
ChildHeader childHeader = lines.get( 0 ).getHeader( );
…

姜振濂
2023-03-14

由于ChildHeader的“getLines”并没有重写Header的声明(鉴于它是一个抽象方法,最终将不得不这样做),因此无论出于何种目的,您都试图通过不同的返回类型来重载该方法。

在Java中,这是不允许的。

有什么原因不能像这样重写Header的“getLines”方法:

@Entity
public class ChildHeader extends Header{
    @OneToMany
    public List<Line> getLines(); 
          // since this isn't an abstract class, there
          // should be an implementation here
}

由于“ChildLine”扩展了“Line”,您仍然可以返回一个只有“ChildLine”的列表。您只需要确保在调用这样的方法时,Line列表中的那些“ChildLines”被转移到ChildLine列表中。

类似的逻辑适用于line类。ChildLine试图从第行重载“getHeader()”,而通过确保返回类型匹配,可以更容易地重写该方法。

 类似资料:
  • 问题内容: 您将如何在以下示例代码中配置注释?我只想保留JPA注释,避免使用Hibernate特定的依赖项。 下面的代码正确吗? (这些类将具有多个版本,RefSomeOtherExample等,并且每个类一个db表。有些可能会添加其他字段(列),但大多数只会使用继承自“ RefData”基类的基本字段。) 基类: 最终,我想使用Hibernate的SchemaExport类从中生成模式创建脚本。

  • 继承一个可以实现的普通超类有什么不同吗? atm我有一个名为的抽象类,我有/扩展这个。 abstractcar中的一个字段设置为"私有int容量" 但是在子类“小型汽车”中,当我输入“容量”作为构造函数中使用的变量时,它说“容量在抽象汽车中有私有访问” 我想: > 子类继承超类的所有字段和方法? 我现在该怎么进行?

  • 我有一个抽象类,这个类是在她的子类中扩展的: < li >我在这个抽象类上实现了一个方法,并抽象了另一个方法 < li >实现的方法是每个子类对象都必须访问的通用方法。所以我决定在抽象类上实现它,避免在每个子类上实现相同的方法。 小例子: 我想听听你对这种实施方式的看法, 问候。

  • 问题内容: 我的数据模型代表法人实体,例如企业或个人。两者都是纳税实体,都具有TaxID,电话号码和邮件地址的集合。 我有一个Java模型,其中有两个扩展抽象类的具体类。抽象类具有两个具体类共有的属性和集合。 我正在 MySQL* 数据库上使用 Hibernate JPA注释,其类如下: * 问题是,和对象需要参考他们的主人,这是一个。hibernate抱怨: 看来这将是一个相当普遍的Java继承

  • 我有一个关于JPA中继承的问题,是否可以使用JOINED策略来实现这个层次结构? 这是我的代码: 在上面的层次结构之后,我尝试使用JPQL进行查询,这是查询: 此代码从主代码运行 当我运行该查询时,会抛出以下错误 导致原因:com . MySQL . JDBC . exceptions . JDBC 4 . MySQL syntaxerrorexception:未知列“employee1_。“字段

  • 问题内容: 我可以以某种方式在抽象类上对一组注释进行分组,并且扩展该类的每个类都已自动分配了这些注释? 至少以下情况不起作用: 问题答案: 答案是不 除非注释类型具有@Inherited元注释,否则不会继承Java注释:https : //docs.oracle.com/javase/7/docs/api/java/lang/annotation/Inherited.html。 Spring的注释