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);
当我从数据库加载之前加载的实例时,我得到的是实体代理而不是真实实体。
我第一次加载实例是通过执行此代码的方法
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);