当我从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
时,我得到一个实体代理。但是如果调用函数来获取一个新的实体(尚未加载),那么我就得到了真实的实体。
我不理解这种行为,我不知道问题出在哪里。
这对我很重要,因为定义了实体的层次结构,并且代码为父实体类而不是子实体类执行。然后当我得到父实体代理时,实体子的方法不存在
此致
答案 0 :(得分:1)
如果你想要unproxy版本,你可以这样做:
Object unproxied = ((SessionImplementor)session).getPersistenceContext().unproxy(proxy);