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

时间:2015-06-23 16:15:04

标签: java hibernate jpa orm hibernate-mapping

当我从db加载先前加载的实例时,我正在获取实体代理而不是真实实体。

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

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时,我得到一个实体代理。但是如果调用函数来获取一个新的实体(尚未加载),那么我就得到了真实的实体。

我不理解这种行为,我不知道问题出在哪里。

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

此致

1 个答案:

答案 0 :(得分:1)

如果你想要unproxy版本,你可以这样做:

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