如何unproxy一个hibernate对象

如何解析hibernate对象,以便支持多态?

请考虑以下示例。 类A和B是两个hibernate实体。 B有两个亚型C和D.

List resultSet = executeSomeHibernateQuery(); for(A nextA : resultSet) { for(B nextB : nextA.getBAssociations() { if(nextB instanceof C) { // do something for C } else if (nextB instanceof D) { // do something for D } } } 

此代码无法执行C或D块,因为B集合已延迟加载,并且B的所有实例都是Hibernate代理。 我想要一种解开每个实例的方法。

注意:我意识到可以优化查询以急切地获取所有B。 我正在寻找替代方案。

这是我们的解决方案,添加到我们的持久性工具中:

 public T unproxy(T proxied) { T entity = proxied; if (entity instanceof HibernateProxy) { Hibernate.initialize(entity); entity = (T) ((HibernateProxy) entity) .getHibernateLazyInitializer() .getImplementation(); } return entity; } 

使用HibernateProxy和getImplementationMethod的解决方案是正确的。

但是,我假设您遇到了这个问题,因为您的集合被定义为接口,而hibernate正在为接口提供代理。

这导致了设计问题,为什么“if”与“instanceof”而不是使用接口方法来做你需要的。

所以你的循环变成:

 for(B nextB : nextA.getBAssociations() { nextB.doSomething(); } 

这样,hibernate会将对“doSomething()”的调用委托给实际的实现对象,而你永远不会知道它们的区别。