Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.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 如何获取父实体?_Java_Hibernate_Jpa 2.0_Java Ee 6 - Fatal编程技术网

Java 如何获取父实体?

Java 如何获取父实体?,java,hibernate,jpa-2.0,java-ee-6,Java,Hibernate,Jpa 2.0,Java Ee 6,我将JPA2与Hibernate一起使用。有两个实体类,CardElement和IdentityDocumentKind。最后一个是第一个的继承实体。采用单表继承策略。当我试图通过查询从CardElement中选择父类的实例时,其中id='123456',出现以下错误: id为123456的对象不属于指定的子类: org.cp.cardsystem.cardeElement(鉴别器:SDocClass) 我没有“SDocClass”鉴别器值的子类。实际上,在开发IdentityDocumentK

我将JPA2与Hibernate一起使用。有两个实体类,
CardElement
IdentityDocumentKind
。最后一个是第一个的继承实体。采用单表继承策略。当我试图通过查询从CardElement中选择父类的实例时,其中id='123456',出现以下错误:

id为123456的对象不属于指定的子类: org.cp.cardsystem.cardeElement(鉴别器:SDocClass)


我没有“SDocClass”鉴别器值的子类。实际上,在开发
IdentityDocumentKind
时,
cardeelement
的类查询在整个应用程序中被广泛使用。因此,我无法为每个鉴别器值创建一个子类
CardElement
,并在所有现有查询中用它替换
CardElement
。这对我来说太费劲了。当使用单表继承策略时,是否有方法实例化父实体类?

我不确定是否正确理解您的问题。您正在使用单表策略来存储整个继承层次结构。但是,您只映射了一些鉴别器,这次是未映射的鉴别器导致了问题(因为Hibernate不知道该子类的含义)。我对你的问题理解正确吗


考虑使用特殊的DB视图,而不是实际的表。该视图仅使用您可以处理的鉴别器公开记录。

问题已解决。我用这种方式注释了继承层次结构的根实体类(
cardeelement
):
@DiscriminatorValue(value=“notnull”)
。现在我可以选择这个类的对象,而无需为每个鉴别器值创建子类
notnull
null
似乎是Hibernate的特殊鉴别器值,它们分别匹配鉴别器列中除null和null之外的任何内容。我在Hibernate的官方文档中没有找到关于这些值的任何信息。所以它可能是某种未记录的功能。

是的,您已经正确理解了我的问题。但使用这样的DB视图而不是表会使所有带有未映射鉴别器的记录都无法通过CardElement访问。通过CardElement实体类提供处理所有现有数据的可能性非常重要。但您希望如何提供访问权限?您不想创建相应的子类,那么应该如何授予访问权限?为什么不能为discriminator的每个值创建一个子类(即使它只是扩展父类的一个空类也可以),或者,忘记继承,不管它是什么IdentityDocumentKind。创建identitydocumentkind时,只需将该字段视为一个attribute,我认为可以将具有未映射鉴别器的记录处理为CardElement实例。我可以为每个鉴别器值创建继承的实体。但它需要在已经使用CardElement访问数据的所有应用程序中重构大量代码。这段代码在开发IdentityDocumentKind的时候就已经存在了。我相信,如果你只是为了数据访问,你不需要做任何重构。因为每个子类都继承自CardElement,也就是说,这样的子类“是一个”CardElement。用户仍然可以将其视为CardElement(这就是多态性的优点,不是吗?)。重构不是必需的。在我的例子中,现在为每个鉴别器值生成一个后代就足够了。乍一看,使用CardElement的现有代码不受影响。谢谢你这个好主意。然而,这种解决方案会导致另一个潜在问题。这使得在运行时无法使用新的鉴别器值创建CardElement实例。所有鉴别器值必须在开发时定义。有解决办法吗?