一尘不染

如何取消休眠对象的代理

hibernate

如何取消代理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。我正在寻找替代方案。


阅读 279

收藏
2020-06-20

共1个答案

一尘不染

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

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