Hibernate代理对象包含什么?

时间:2014-08-16 13:24:42

标签: java hibernate orm proxy hibernate-mapping

我从谷歌那里得到的就是:

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

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

那么,Proxy对象到底包含什么?

它是否包含仅设置了id字段的骨架对象引用对象?我们调用get方法时会设置其他字段吗?

Proxy对象是否包含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 个答案:

答案 0 :(得分:38)

正如我的书High-Performance Java Persistence中所解释的那样,Hibernate Proxy用于替换实际的实体POJO(Plain Old Java Object)。

Proxy类在运行时生成,它扩展了原始实体类。

Hibernate使用代理对象来实现允许lazy loading

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

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

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