如何将休眠代理转换为真实的实体对象

2022-08-31 06:39:31

在休眠期间,我正在加载一些对象,并且由于延迟加载,其中一些对象被加载为代理。一切都很好,我不想关闭延迟加载。Session

但后来我需要通过RPC将一些对象(实际上是一个对象)发送到GWT客户端。碰巧这个具体对象是一个代理。所以我需要把它变成一个真实的物体。我在Hibernate中找不到像“物化”这样的方法。

如何将一些对象从代理转换为知道其类和ID的实数?

目前,我看到的唯一解决方案是从Hibernate的缓存中逐出该对象并重新加载它,但由于许多原因,它确实很糟糕。


答案 1

这是我使用的一种方法。

public static <T> T initializeAndUnproxy(T entity) {
    if (entity == null) {
        throw new 
           NullPointerException("Entity passed for initialization is null");
    }

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

答案 2

从Hibernate ORM 5.2.10开始,你可以这样做:

Object unproxiedEntity = Hibernate.unproxy(proxy);

休眠之前 5.2.10.最简单的方法是使用Hibernate内部实现提供的unproxy方法:PersistenceContext

Object unproxiedEntity = ((SessionImplementor) session)
                         .getPersistenceContext()
                         .unproxy(proxy);

推荐