为什么我在运行模式下获得了HibernateProxy obj,但在调试模式下获取了域。这是怎么回事?

时间:2015-09-04 17:47:10

标签: java hibernate

我有像

这样的域对象
public class Person{
  private String name ;
  private Integer age;
}

我有像

这样的DAO标准
{
  Criteria c = sesseion.createCriteria(Person.class);
  c.setProjection(Projections.distinct(Projections.projectionList().add(Projections.property("age"))));
  List<Object> rows = c.list();
  for(Object obj:rows){
     if ((obj != null) && (obj instanceof HibernateProxy))
    {
      doSomething...
    }
  }
}

当我在运行模式下运行时,它可以工作,但是当我在“if”条件行设置调试点时,它显示我得到的obj是Person类,而不是HibernateProxy。然后它在调试模式下失败。

为什么一个对象在运行模式和调试模式下显示为不同的实例形式?

1 个答案:

答案 0 :(得分:1)

Hibernate最初加载类的代理(基于加载策略),当你在该代理上调用某个方法时,它实际上加载了原始对象。在调试模式下,eclipse使用内省(调用字段或setter或getter)。

在你的情况下toString()在代理被调用,它在内部使用该类的其他字段,因此,hibernate加载原始对象。