Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.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中的继承-如何访问子类值?_Java_Inheritance_Jpa - Fatal编程技术网

Java JPA中的继承-如何访问子类值?

Java JPA中的继承-如何访问子类值?,java,inheritance,jpa,Java,Inheritance,Jpa,我有以下课程 class A { private int field1; private int field2; private int field3; private int field4; } Class B extends A { private int field3; private int field4; } 根据A类的“field1”值,我需要访问B类字段或C类字段,并设置父字段的值 我正在为JPA使用orm映射xml。类A表及其子类映射到不同的表,因此我将继承策略指定为联接

我有以下课程

class A {
private int field1;
private int field2;
private int field3;
private int field4;
}


Class B extends A {

private int field3;
private int field4;
}

根据A类的“field1”值,我需要访问B类字段或C类字段,并设置父字段的值

我正在为JPA使用orm映射xml。类A表及其子类映射到不同的表,因此我将继承策略指定为联接

类A中有一些字段需要在加载后进行转换,还需要设置一个“field3”和一个“field4”值,因此我指定了实体列表器

JPA查询在这些类A、B、C的三个表之间创建联接,并从所有三个类中检索值

但在后期加载中,我只得到了父类A

我的问题是:如何访问B类和C类字段值??这样我就可以设置父字段值。

根据您的问题:

JPA查询在这些类A、B、C的三个表之间创建联接,并从所有三个类中检索值

因此,创建三个不同的类A、B和C,不要像您提供的那样继承。使用join将三个表检索到三个对象A、B和C中。
现在有三个对象a、b和c。现在检查a.field1的值并访问对象b或c。

制作摘要。然后,您可以执行实例,以了解其类型并将其转换为该类型:

if (a instance of B) {
      B b = (B) a;
} else if (a instance of C) {
      C c = (C) a;
}

您希望取回一个实体还是几个实体?我看不出A的实例如何包含B类和/或C类表中的数据。此外,A中的所有字段都声明为私有字段,因此B和C无法(轻松)访问它们。A无法在内部访问B和C值。我希望只有一个实体A返回并发送给其他组件。从JPA生成的查询也会从B和C检索所有值。所以我需要得到B或C的值,然后设置A。在实体侦听器post load方法中,我需要得到B和C。但是我不知道如何得到B和C。所以你也得到了B和C的实例?这就是如何得到B和C的实例的问题?你没有发布任何代码,所以很难看到你实际上在做什么。我似乎记得JPA将结果集映射到几个不同实体(即不同类型)的方法。否则,您可以使用@SecondaryTable注释并读取所有需要的数据,然后执行所需操作。我已在类A上设置了实体侦听器post load方法。因此,在post load方法中,我正在检查实例。它给出了A的实例,但不是B或C。因此,我无法理解如何获得B和C(我假设它们已加载)。请您对继承层次结构中的构造函数调用层次结构多加评论好吗?很抱歉,我误导了您,因为我认为B类扩展了A类,C类扩展了B类。如果我创建三个独立的类并加入它,我将编辑我的答案。这意味着我需要在A类中添加额外的字段。它可能有效,但A类是由企业提供的,因此我无法对其进行更改。因此,我创建了两个子类,它们不是业务部门提供的。类B&C是我自己创建的,用于解析业务逻辑,因为详细的初始类A还有其他字段,这些字段不是B和C继承的。因此,使类A抽象可能不起作用。此外,该业务还提供了A类,因此我无法对其进行更改。根据定义,所有字段都是继承的。。。这就是继承的意义所在。如果您不能更改类A,那么我建议您创建两个方法,一个用于检索B对象,另一个用于检索C对象。
if (a instance of B) {
      B b = (B) a;
} else if (a instance of C) {
      C c = (C) a;
}