如何取消代理hibernate对象,以支持多态?
考虑以下示例。A和B类是两个hibernate实体。B具有两个子类型C和D。
List<A> 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; }