java - 为什么 hibernate 返回一个代理对象?

标签 java hibernate spring

我有一个调用 DAO 的服务方法,然后从数据库返回一个对象。从系统的许多部分调用此方法。但是,一个特定的方法是获取 ObjectClass_$$_javassist_somenumber 的返回类型作为类型。这是扔掉东西。我调用服务方法与其他地方完全相同,那么为什么 hibernate 会返回代理而不是自然对象?

我知道有一些方法可以公开“代理”对象,但我觉得我不应该这样做。

查询很简单

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

顺便说一句,我正在使用 hibernate 3.3。

最佳答案

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

如果不以这种方式代理,几乎不可能实现无缝延迟加载。

我不记得如果您使用预先加载,那么是否会返回自然对象。我通常不建议使用预加载,尤其是当您有很多链接的子实体时,因为它很快就会成为一个巨大的性能瓶颈,因为它会将每个链接的对象都吸入内存中。

此外,如果您需要区分类类型,而不是使用 obj.getClass(),请使用 Hibernate.getClass(obj),这会给您带来返回自然对象类,不管它是否被代理:参见 Hibernate API Javadocs here .

关于java - 为什么 hibernate 返回一个代理对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2594804/

相关文章:

java - 从 Word 文档的页脚中删除段落

java - 最近 Xodus 版本中的服务提供商接口(interface)

java - 基于列值的 JPA 目标实体类型

SpringServletContainerInitializer 不能强制转换为 javax.servlet.ServletContainerInitializer

java - EXcel 表 POI 验证 : Out Of Memory Error

hibernate - 如何为按关系计数(一对多)排序的所有实例创建条件?

java - Spring boot服务API启动时出现异常(值为 'ServletContext resource [/dbo]'的属性spring.datasource.schema无效)

java - 为什么响应实体返回带有 setter/getter 名称而不是数据成员名称的 json

java - 带有显式模板的 Spring Boot mongo 配置无法启动

java - ArrayList<WeakReference<Runnable>> - 如何最好地整理?