【问题标题】:Hibernate save lazily fetched entity via stateless sessionHibernate 通过无状态会话保存延迟获取的实体
【发布时间】:2013-09-03 13:34:48
【问题描述】:

出于优化目的,我想使用休眠无状态会话更新一些实体。

然而,这些实体是从“经典”会话加载的(我需要缓存功能来更快地加载我的实体)。 所有这一切都可能很好,但我的一些实体被延迟初始化,所以它们的类名类似于:myentity_$$_javassist_22。因此,我的无状态会话不想更新我的实体。

有没有办法将延迟初始化的实体转换为加载的实体?

谢谢

【问题讨论】:

    标签: java hibernate jpa playframework


    【解决方案1】:

    如果您在将所有延迟加载的实体提供给无状态会话之前手动获取它们,它将起作用(不再有代理)。但它可能会花费很多,因为它会生成许多查询来加载完整的对象图。

    例如,您要么使用 Hibernate.initialize(lazyEntity) 获取它们,要么使用代理杀死方法杀死它们(但您将保存 null:可能不是您想要的)。

    查看有关 Hibernate stateless session 的其他问题,看看它是否是解决您问题的好方法 Using StatelessSession for Batch processing

    【讨论】:

    • 我在查询中使用左连接获取来获取它们,但其中一些仍然是延迟加载的(可能是因为缓存)。此外,我知道我的实体(延迟加载的实体)在缓存中,因为当我访问它们时,不再进行查询。所以,我不知道如何获取它们,因为我正在尽一切努力获取它们。这就是为什么我想知道是否可以手动加载它们以便能够在我的无状态会话中使用它们。顺便说一句,我需要一个无状态会话,因为批处理会让我清除缓存,并且我需要缓存用于我的应用程序的后续步骤
    • Hibernate.initialize(object) 是一种强制加载惰性实体的方法。
    • 但我认为在一个查询中完全加载图表可能会更好(逻辑上更好的性能)。您最终可以使用本机查询或 Hibernate 的工作 API 来为此定义自定义 SQL 查询。
    • 这已经是我正在做的事情了(在一个查询中完全加载),但是由于缓存,一些孩子没有完全加载(我得到代理类)。这就是为什么我一直在寻找手动加载它们的解决方案(因为实体在缓存中,所以不执行查询,所以速度很快)。 Hibernate.initialize(object) 确实是解决方案,它对我有用,我的代码快 12 倍。我会将您的答案标记为正确答案并对其进行编辑以添加一个帮助我使用 Hibernate.initialize() 的链接(因为仅此功能还不够)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 2012-06-20
    • 2011-06-14
    • 2018-10-04
    相关资源
    最近更新 更多