gpt4 book ai didi

java - 返回代理对象的简单 Hibernate/JPA 查询

转载 作者:行者123 更新时间:2023-12-01 20:52:16 27 4
gpt4 key购买 nike

我正在使用 Hibernate 5 和 Spring Data。在我的 PartyDao 中,我有以下方法:

@Query("from Party where id in :partyIDs")
List<PartyTO> loadByIDs(@Param("partyIDs") List<Long> partyIDs);

我这样调用它:

partyList = partyDao.loadByIDs(userPartyIDsList));

但我得到了 Hibernate 代理对象的列表(所有字段都设置为 null 和类型为 org.hibernate.proxy 的 handler 字段。 pojo.javassist.JavassistLazyInitializer)。

这对我来说毫无意义!为什么 Hibernate 不加载我指定的从查询根对象?

我把它改为:

@Query("select party from Party party where party.id in :partyIDs")
List<PartyTO> loadByIDs(@Param("partyIDs") List<Long> partyIDs);

试图更明确地表明我想要获取this对象,但它仍然返回代理对象。我有什么遗漏的吗?我不知道如何让它自行获取。

编辑:代理对象实际上有一个名为target的属性,它设置了所有属性。为什么它们不被放置到对象本身中?

我没有收到“延迟初始化异常”,而是在按名称对各方进行排序的 Comparator 内收到 NullPointerException:

...
return o1.name.compareTo(o2.name);

最佳答案

问题在于您直接访问对象的 name 属性。

    ...
return o1.name.compareTo(o2.name);

Hibernate 将始终返回代理对象,并且一些更复杂结构的序列化可能会导致您将来遇到问题,包括提到的延迟实例化异常。但是,问题的原因是直接访问属性,如果您在比较器中正确使用 getter 函数,则不会遇到任何其他问题。

代理对象是目标类的运行时扩展,它将具有与目标类相同的接口(interface),但在真正的 OOD 方式中,内部是不可见或不可访问的。唯一的保证是所提供的接口(interface)契约,这就是您应该根据其进行编码的内容,无论在您的对象中。

更改您的比较器和其他代码以匹配以下内容,您就不会再遇到此问题。

    ...
return o1.getName().compareTo(o2.getName());

关于java - 返回代理对象的简单 Hibernate/JPA 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43050414/

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