【问题标题】:Whats the safest way to remove lazy initialization proxies generated by Hibernate?删除 Hibernate 生成的延迟初始化代理的最安全方法是什么?
【发布时间】:2015-10-17 18:58:40
【问题描述】:

我想保持父/子关系,但是当我解析父对象时,我不想获取子元素。

【问题讨论】:

    标签: java hibernate orm lazy-initialization proxies


    【解决方案1】:

    生成代理以便 Hibernate 可以拦截对未初始化关联的调用并尝试按需获取它们。

    LazyInitializationException 是一种代码味道。您得到它是因为您在关闭Session 之前没有正确初始化所有必需的实体关联。切换到 EAGER 关联也是 bad idea,因为获取策略是查询职责。

    如果您不需要它们,请尝试减少关联的数量并改用查询。您可以仅使用多对一关联(镜像 FK 关系)构建应用程序,并且可以使用 DAO 方法代替一对多关联。

    至于这句话:

    我想保持父/子关系,但是当我解析时 通过父对象我不想获取子元素。

    如果您保持父/子关系,则始终需要在使用之前加载关联。尝试删除代理听起来像是在尝试破解解决方案,而不是正确设计应用程序层。

    所以代理很好,它们允许您提高应用程序性能,因为当您尝试访问根实体时并不总是获取所有关联。

    要禁用代理,您只需使用 Proxy 注释来注释您的实体:

    @Proxy(lazy=false)
    

    【讨论】:

    • 首先谢谢..这是我的担忧...您说“您可以使用 DAO 方法代替一对多关联”。如果没有一对多关联,我将无法对复杂查询使用显式连接......使用一对多关联,延迟初始化,我们正在使用 Jax-B 解析整个对象,子元素将被访问并它将被获取..这是不必要的和性能损失。 @Proxy(lazy=false) 也没有带来代理,但它正在获取所有子元素..这又是不必要的和性能损失....如果您有任何建议,请告诉我。
    • 好吧,当您计划修改实体时,获取实体是有意义的。在您的情况下,投影更合适,并且总是会表现得更好。您可以编写一个可移植的 natie 查询,并且可以只获取您的用例所需的数据。
    • 你实际上是对的......我唯一的选择是原生查询......但我们再次有一个奇怪的要求进行分页。当父母有很多孩子时分页会失败,我们使用本机查询来获取父母中的一些元素和孩子中的一些元素。无论如何谢谢真的很感激......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-28
    • 1970-01-01
    • 1970-01-01
    • 2012-03-16
    • 1970-01-01
    相关资源
    最近更新 更多