Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用hibernate延迟加载时的主要问题是什么?_Java_Hibernate_Lazy Loading - Fatal编程技术网

Java 使用hibernate延迟加载时的主要问题是什么?

Java 使用hibernate延迟加载时的主要问题是什么?,java,hibernate,lazy-loading,Java,Hibernate,Lazy Loading,我多次听说hibernate中出现了一些问题(特别是在使用延迟加载时)。哪些是最常见的,可以做些什么?最常见的可能是,当延迟加载集合导致使用n+1个单独的查询而不是单个联接查询命中数据库时 解决这些问题的办法是常识:-)我认为(首先是)广泛讨论这个(和其他相关)问题,以及解决方案和变通办法。简言之,您不应该盲目地从食谱中复制食谱——测量代码的性能并相应地调整它。如果您看到发出了太多的选择,您可以有选择地从延迟加载切换到该特定属性/类/查询的联接或子选择获取策略。(请注意,这两种方法都有其潜在的缺

我多次听说hibernate中出现了一些问题(特别是在使用延迟加载时)。哪些是最常见的,可以做些什么?

最常见的可能是,当延迟加载集合导致使用n+1个单独的查询而不是单个联接查询命中数据库时

解决这些问题的办法是常识:-)我认为(首先是)广泛讨论这个(和其他相关)问题,以及解决方案和变通办法。简言之,您不应该盲目地从食谱中复制食谱——测量代码的性能并相应地调整它。如果您看到发出了太多的选择,您可以有选择地从延迟加载切换到该特定属性/类/查询的联接或子选择获取策略。(请注意,这两种方法都有其潜在的缺点,因此,性能度量也是关键。)


当客户机代码取决于实体/属性的实际类型时,会出现一个不同的问题,尽管这个问题非常罕见(例如,通过使用
instanceof
对其进行测试。如果遇到代理对象,这类代码就会中断,而代理对象不是它所代表的具体类的实例。但是,无论如何,编写这类代码并不是最好的主意,应该很少需要。但是,有时它会与遗留代码一起继承,从而导致冲突,这可能会导致很难解决。

HQL的获取策略可用于故意指定需要加载的内容。例如(从):

从Cat作为Cat
内连接取回cat.mate
左联合取回猫小猫

不幸的是,Hibernate不支持作为HQL的一部分的SQL的所有标准选择功能,这取决于项目要求,可能是禁止的。例如,从选择中选择是不可能的,但创建报告或执行数据分析时经常需要

Hibernate执行SQL的能力可以克服这一点。但是,这种方法不能提供HQL面向对象的优点(例如,所有连接都必须手动创建)。

首先,延迟获取是一种可行的方法,因为它允许您获取所需的信息

如果在
会话
打开时未初始化惰性关联,并且在持久性上下文关闭后尝试导航未初始化的代理/集合,则唯一的问题是
LazyInitializationException

N+1查询问题可能会出现在急切(当您执行没有显式获取所有急切关联的JPQL查询时)和惰性关联上,解决方案与
LazyInitializationException
相同


但是,您可以在测试期间自动检测所有N+1查询问题。请检查此项。

太模糊了。您是否有特定问题?是否在我的应用程序中使用延迟加载的问题。:D我想知道我可能会面临什么。太好了!事情的实例是我一开始就不确定的。谢谢。还有延迟加载异常,第一次请求分离对象的属性时出现。这很重要!