Hibernate代理对象包含什么?

54

我从Google上了解到的是:

  • Hibernate使用代理对象来实现延迟加载。当我们请求从数据库加载对象时,如果获取的对象具有对另一个具体对象的引用,则Hibernate返回代理而不是具体关联对象。

  • Hibernate使用字节码增强(由javassist提供)创建代理对象。Hibernate在运行时使用代码生成库创建我们实体类的子类,并用新创建的代理替换实际对象。

那么,代理对象究竟包含什么?

它是否包含一个骨架对象引用,只设置了id字段?当我们调用get方法时,其他字段将被设置吗?

代理对象是否包含检索所有所需数据以完全填充引用对象的JDBC语句。

还有其他我可能遗漏的东西吗?

我不是在要求别人替我完成工作,但如果您能提供任何信息链接,那将是很好的。

对上述描述的任何更正也将受到欢迎。

例如。

class Address {
   String city;
   String country;
}

class Person{
   int id;
   String name;
   Address address;
}    

当我们尝试加载Person对象时,Hibernate会继承Person类,如下所示:

class ProxyPerson extends Person {
       int id;
       String name;
       Address proxyCGLIBObject;
}

返回一个ProxyPerson对象。ProxyPerson对象将具有id和name的值,但代理了Address。

我理解得对吗?

如果在代理对象上添加toString()方法,我可以期望什么?

1个回答

58

Hibernate代理用于替代实际的实体POJO(Plain Old Java Object)。

代理类在运行时生成,并继承原始实体类。

Hibernate使用代理对象来实现[延迟加载][1]。

当访问代理上的基本属性时,它只是委托调用原始实体。

实体类中的每个ListSetMap类型都被一个PersistentListPersistentSetPersistentMap所替换。这些类负责拦截对未初始化集合的调用。

代理不发出任何SQL语句。它只触发一个InitializeCollectionEvent,由相关侦听器处理,该侦听器知道要发出哪个初始化查询(取决于配置的获取计划)。


谢谢Vlad,我的问题不是关于集合,而是关于引用其他类。请现在查看添加的示例。 - vineeshchauhan
1
我还是不明白。 - sparkyspider
@Spider,我更新了答案。如果现在清楚了,请告诉我。 - Vlad Mihalcea

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接