加载hibernate实体的子类时遇到问题

时间:2011-08-14 15:09:51

标签: hibernate hibernate-mapping

我有一个实体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服务器。

2 个答案:

答案 0 :(得分:1)

听起来您可能正在获取代理而不是实际实例,这就是您无法转换为子类的原因。以下内容可帮助您解开代理:

Converting Hibernate proxy to real object

答案 1 :(得分:0)

你会遇到与Hibernate的延迟加载机制有关的这个问题。 Hibernate将每个延迟加载的对象包装到一个所谓的代理对象中。从数据库加载x.a时,对象HibernateProxy的类型为x

我发现这个解决方案很有用(类似于@ Abdullah的)。

How to unproxy a hibernate object

您也可以急切地获取关系x.a以避免此问题,因此不会创建代理对象。