一尘不染

Hibernate代理对象包含什么?

hibernate

我可以从Google那里收集到的是:

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

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

那么,代理对象到底包含什么?

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

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()方法有什么期望?


阅读 236

收藏
2020-06-20

共1个答案

一尘不染

这是一个非常常见的问题,因此此答案基于我博客上的这篇文章

Hibernate代理用于替代实际的实体POJO(普通的旧Java对象)。

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

Hibernate使用Proxy对象作为实体是为了允许延迟加载

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

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

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

2020-06-20