我在处理 Hibernate 中的映射超类时遇到了一些问题。我有两个应用程序,产品和制造商,它们共享一个公共库,但彼此之间没有任何直接依赖关系。Common lib 有一个抽象的 MappedSuperclass (common.domain.Manufacturer),它是基本实体。制造商有一个扩展通用类的具体类。Product 中没有该类的具体版本。
最初,我什至无法编译它,因为 common.domain.Manufacturer 没有被识别为实体。我可以通过我的 ORM 配置定义实体映射来解决这个问题(有关更多详细信息,请参阅:处理映射超类中的休眠持久性)。虽然这确实解决了编译问题,但不幸的是我在运行时仍然看到错误。当我在映射的超类上调用 entityManager.find() 时,它失败并出现错误:
org.hibernate.InstantiationException: Cannot instantiate abstract class or interface: : com.tura.common.domain.Manufacturer
我想也许我可以使用 entityManager.getReference() 而不是 find()。只要我实际上不需要除主键之外的任何有关制造商的信息,它就可以工作。不幸的是,代码中有几个地方我需要一些关于制造商的额外信息。一旦我访问 Id 以外的任何字段,它就会失败并出现相同的错误。
我现在可以看到三个选项,但它们都有我想避免的缺点。我可以使该类的 Common 版本具体化,但这会破坏首先具有此层次结构的目的。我不希望通用版本被实例化并可能持久化。只有制造商应用程序应该这样做。我可以在 Product 应用程序中创建一个具体的类,但这需要向数据库添加一个在休眠之外没有意义的 DTYPE。最后也是最糟糕的选择是让 Product 和 Manufacturer 具有直接依赖关系。除非用尽所有其他可能性,否则我什至不会考虑。
我觉得必须有一些干净的方式来做我需要的事情。任何帮助将不胜感激。