当前位置: 首页 > 面试题库 >

为何Hibernate返回代理对象?

锺伟志
2023-03-14
问题内容

我有一个服务方法,该服务方法调用DAO,然后从数据库中返回一个对象。从系统的许多部分调用此方法。但是,一种特定的方法是将ObjectClass _ $$ _ javassist_somenumber的返回类型作为该类型。这是丢东西。我将service方法称为与其他任何地方完全相同的方法,那么为什么hibernate会返回代理而不是自然对象?

我知道有很多方法可以暴露“代理”对象,但是我认为我不必这样做。

查询很简单

hibernateTemplate.find("from User u where u.username = ?", username)

我正在使用hibernate3.3 btw。


问题答案:

它是代理对象,以支持延迟加载。基本上,只要您通过访问器/获取方法引用了子对象或查找对象,如果链接的实体不在会话缓存中,则代理代码将转到数据库并加载链接的对象。它使用javassist有效地动态生成对象的子类实现(尽管我认为它也可以配置为使用CGLIB)。

如果不采用这种方式进行代理,则几乎不可能实现无缝的延迟加载。

我不记得我是否要使用急切加载,然后是否返回自然对象。我一般不建议使用紧急加载,特别是如果您有许多链接的子实体时,因为它很快就会成为巨大的性能瓶颈,因为它将把每个链接的对象都吸收到内存中。

另外,如果你需要在类的类型区分,而不是使用obj.getClass(),使用Hibernate.getClass(obj)它会给你不管它是否proxed还是不回自然物类:请参阅Hibernate
API的Javadoc
在这里。



 类似资料:
  • 我的域模型中有一个层次结构,由类描述: 我正在获取如下对象: (我使用的是spring数据) 问题是Hibernate返回代理对象(据我所知),但代理属于BaseEntity,而不是正确的子类(其“类是BaseEntity\u$$\ uJVSTED9\u26,因此IndividualEntity的实体实例为false)。 有趣的是,并非所有对象都作为代理返回。 我在循环中获取实体(公共事务),其中

  • 问题内容: 在Hibernate期间,我正在加载一些对象,由于延迟加载,其中一些对象已作为代理加载。一切正常,我不想关闭延迟加载。 但是稍后我需要通过RPC将一些对象(实际上是一个对象)发送到GWT客户端。碰巧这个具体对象是代理。所以我需要将其变成一个真实的对象。我在Hibernate中找不到类似“实现”的方法。 我如何才能将某些对象从代理变为真实,从而知道它们的类和ID? 目前,我看到的唯一解决

  • 所以我的问题是,为什么交易未能将它从Hibernate代理转换为真正的对象?而且,如果我从上面的注释中删除(fetch=fetchtype.lazy)部分,这是一个变通方法吗?不过,我不愿意这样做,因为上面的代码实际上在Measure的父类中,它可能会对其他代码产生连锁反应。(为了更简单的说明,我移动了贸易属性来度量)。

  • 我的应用程序不会向url发送请求: https://myserver.domain.com/authenticate/credentials OkHttp客户端拦截器显示我的标题: 11-17 10:10:56.780 3140-3304/com.myapp.debugD/OkHttp: Content-Type: Application/x-www-form-urlencoded 11-17 1

  • 问题内容: 我可以从Google那里收集到的是: Hibernate使用代理对象来实现延迟加载。当我们请求从数据库中加载对象,并且获取的对象具有对另一个具体对象的引用时,Hibernate返回一个代理而不是具体的关联对象。 Hibernate使用字节码检测(由Javassist提供)创建代理对象。Hibernate在运行时使用代码生成库创建我们的实体类的子类,并将实际对象替换为新创建的代理。 那么

  • 我能从谷歌得到的信息是: > Hibernate使用代理对象实现延迟加载。当我们请求从数据库加载对象,并且获取的对象引用了另一个具体对象时,Hibernate会返回一个代理,而不是具体的关联对象。 Hibernate使用字节码检测(由javhelp提供)创建代理对象。Hibernate在运行时使用代码生成库创建我们实体类的子类,并用新创建的代理替换实际对象。 那么,代理对象到底包含什么? 它是否包