Hibernate 为先前加载的实体返回代理

Hibernate returning Proxy for previously loaded entity

当我从数据库加载之前加载的实例时,我得到的是实体代理而不是真实实体。

我第一次加载实例是通过执行此代码的方法

getEntityManager().createQuery(cq).getResultList().get(0)

应用程序第二次执行此方法

public T findById(Long id) {
    DetachedCriteria crit = DetachedCriteria.forClass(entityClass).add(
        Property.forName(IdentifiableEntity.ID_PROPERTY).eq(id));
    Criteria executableCriteria = getExecutableCriteria(crit);
    return (T) executableCriteria.uniqueResult();
}

当我使用已加载实体的 ID 调用 findById 时,我会得到一个实体代理。但是,如果调用该函数来获取新实体(尚未加载),那么我将获得真实实体。

我不明白这种行为a,我不知道问题出在哪里。

这对我来说很重要,因为定义了实体层次结构并且代码针对父实体 class 而不是子实体执行。然后当我得到父实体代理时,实体子实体的方法不存在

此致

如果你想要非代理版本,你可以简单地这样做:

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