如何强制初始化 Hibernate JPA 代理以在 JSON 调用中使用它

Posted

技术标签:

【中文标题】如何强制初始化 Hibernate JPA 代理以在 JSON 调用中使用它【英文标题】:How to force Initialize a Hibernate JPA proxy to use it in a JSON call 【发布时间】:2011-06-08 04:47:33 【问题描述】:

我有一个 Spring 3 + JPA 2.0 应用程序。在我的@Controller 中,我需要一个已初始化的对象,但我有代理,我需要能够以编程方式对其进行初始化。我需要类似于 org.hibernate.Hibernate.initialize(Object) 的功能。

有人可以帮忙吗。该对象用于 AJAX 操作。如果属性是代理,我无法将其作为 JSON 发送

【问题讨论】:

【参考方案1】:

据我所知,没有 JPA 选项。你应该使用Hibernate.initialize(..)

事实上,当我查看 hibernate 的实现时,惰性集合似乎在很多情况下都被初始化了,这是人们意想不到的。喜欢entityManager.contains(..)Persistence.getPersistenceUtil().isLoaded(...)。试试这些,但我认为你不应该依赖这些实现细节。

【讨论】:

是的,谢谢,虽然我可能是这种情况。我不想创建其他对象然后将其发送到视图。由于我们仍处于项目的早期阶段,我们决定转移到休眠状态,因为 JPA 的原因没有坚持:)。现在所有休眠用户只需使用Hibernate.initialise(..)【参考方案2】:

我们正在我们的应用程序中做类似的事情,我们发现拆分我们的数据库实体对象并为 JSON 输出创建另外一堆类很有用。

如果您使用的 JSON 框架只检查您的对象并为对象上的每个属性提取一些 JSON,那么您可以拥有以下对象:

PersonEntity - 由 JPA 管理的类 和 PersonJsonOutput - 专为 JSON 输出设计的类

从长远来看可能更安全。这允许您拥有不会自动反映在 JSON 服务中的数据库更改,您可能希望对 JSON 服务进行版本控制,而不是在数据库实体更改后立即中断旧版本。

它还可以让您更好地控制 JSON 输出,例如日期格式或强制数据库中的数字成为 JSON 中的字符串等...

这个答案真的取决于你如何生成你的 JSON,但听起来你的库做了一些自省。

【讨论】:

【参考方案3】:

我知道已经晚了,答案被接受了,但是另一种标准的 JPA 方法是在从 DAO 返回对象之前调用您希望初始化的列表上的 size() 方法:

Object.getList().size(); 

这使您不必作弊并使用特定于实现的初始化机制

【讨论】:

以上是关于如何强制初始化 Hibernate JPA 代理以在 JSON 调用中使用它的主要内容,如果未能解决你的问题,请参考以下文章

为啥 hibernate 严格要求定义 hibernate.dialect 属性,而 JPA 规范没有强制要求?

无法懒惰地初始化角色集合,..无法初始化代理 - 无会话 - JPA + SPRING

JPA实体代理问题与空值比较

如何使用 JPA 和 Hibernate 映射计算的属性

JPA(Hibernate)代理类的hibernateLazyInitializer属性系列化异常

在 JPA/Hibernate 中正确使用 flush()