gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:57:32 24 4
gpt4 key购买 nike

我有一个调用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com