Hibernate:Hibernate总是使用对象代理吗?

我认为仅当类具有Collection类型的字段并且使用Lazy fetching时才使用对象代理。 但是一些消息来源似乎暗示Hibernate 3对所有对象使用代理,而不管对象是否具有集合类型字段。

当Hibernate使用对象代理时,有人可以解释一下吗? 是在所有的时间,还是只是在某些情况下?

根据Hibernate文档 :

默认情况下,Hibernate对集合使用延迟选择提取,对单值关联使用延迟代理提取。 这些默认值对大多数应用程序中的大多数关联都有意义。

因此,如果您有一个标记为关联的对象(一对一或多对一),那么在您尝试访问它之前它将是一个代理对象,此时Hibernate将尝试使用来自数据库。

AFAIK集合将被初始化为null,直到您尝试访问它为止,此时Hibernate将尝试使用值来对其进行水合。

正如您在评论中建议的那样,您的对象完全依赖于代理对象来在您请求时加载值。

当然,如果在关联上使用fetchType.EAGER ,则这些都不适用。 如果您是Hibernate的新手,我建议仔细阅读我写的指南 。 它涵盖了诸如fetch类型和不同类型关系的配置之类的内容。