如何强制初始化 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