hibernate.enable_lazy_load_no_trans 不工作
Posted
技术标签:
【中文标题】hibernate.enable_lazy_load_no_trans 不工作【英文标题】:hibernate.enable_lazy_load_no_trans is not working 【发布时间】:2015-01-30 23:14:14 【问题描述】:我正在使用 JPA2.1 和 hibernate 4.3.8,并且我已将 presistence.xml 配置为允许延迟加载
我已经添加了
<property name="hibernate.enable_lazy_load_no_trans" value="true" />
进入属性部分
但我仍然收到 LazyInitializtionException,这是什么问题?
【问题讨论】:
属性和this answer的格式一样吗? 是的,问题出在休眠版本 【参考方案1】:hibernate.enable_lazy_load_no_trans
是一个反模式并且你不应该使用它,因为在初始持久性之外获取的每个惰性关联都需要一个数据库连接上下文,这将对底层事务日志和 JDBC 连接池施加压力。
更多,hibernate.enable_lazy_load_no_trans
容易出现 N+1 查询问题。
有时,您甚至不需要实体,而 DTO 投影会更好。
【讨论】:
“永远不要使用它”->“尽可能避免”。这个参数是我们用例的最佳选择(最多 20 个用户,100% 显示在 GUI 中的大实体图(在选项卡、工具提示和对话框中))。 仅仅因为你没有典型的企业并发或数据需求,并不意味着这个设置会给你带来很多好处。正如我在此答案所附链接中所解释的,LazyInitializationException
是与数据访问层设计相关的代码异味。大多数情况下,即使 DTO 就足够了,也会为只读视图获取实体。请记住,仅当您计划修改实体时才需要实体。否则,您只是在消耗数据库资源以获取不必要的列。
在现实世界中,大多数遗留项目都有这样的代码气味,虽然我同意你的所有观点,但你必须使用你所得到的东西。这个参数是一个真正的节省时间,因为它允许我简单地将模型切换到延迟加载以提高性能。 1 mwd 与 15 mwd 返工整个事情。只读操作(生成报告不使用 DTO,因此每次报告需要主实体的属性时,都会立即加载整个图表)。
或者如果之前的团队认为使用 Hibernate 急切加载所有内容是个好主意。由于编辑了相同的数据(= 没有很多新记录),这在生产中运行良好一段时间。在慢慢添加新记录几年后,这个问题才变得明显。我绝对不会在新项目中使用该参数,但它对旧项目非常有用。
您的书不鼓励临时会话延迟加载,但并没有告诉我们永远不要使用它。这是唯一让我感到困扰的事情,因为它是解决我们问题的最佳(= 成本效益)解决方案。【参考方案2】:
尝试像这样输入“true”:
<property name="hibernate.enable_lazy_load_no_trans">true</property>
它对我有用。
【讨论】:
以上是关于hibernate.enable_lazy_load_no_trans 不工作的主要内容,如果未能解决你的问题,请参考以下文章