我有一个实体A,它是实体B和C的超类,A是用@Inheritance注释的(strategy = InheritanceType.JOINED)。
然后是另一个与A有关的实体X。
我用类型B的某个对象设置x.a,但是当我加载x时,检查x.a的类型是A,我不能把它强制转换为B.
我之前做了很多这样的映射,而且工作正常无法知道这里有什么问题。
当我执行entityManager.find(A.class,id)时,它也会返回A,尽管有一个具有相同id的实体B,当我从Junit测试运行它时返回B但是在运行应用程序时不返回tomcat服务器。
答案 0 :(得分:1)
听起来您可能正在获取代理而不是实际实例,这就是您无法转换为子类的原因。以下内容可帮助您解开代理:
答案 1 :(得分:0)
你会遇到与Hibernate的延迟加载机制有关的这个问题。 Hibernate将每个延迟加载的对象包装到一个所谓的代理对象中。从数据库加载x.a
时,对象HibernateProxy
的类型为x
。
我发现这个解决方案很有用(类似于@ Abdullah的)。
How to unproxy a hibernate object
您也可以急切地获取关系x.a
以避免此问题,因此不会创建代理对象。