我知道这已经反复讨论了(我在这个问题上有几个我自己的实现),也许这就是我要问的原因的一部分:没有明确的答案(经过几个小时的搜索)而且我觉得这是捕获22。
我的设置是Spring Boot 1.3.6,已经结婚了#34;到Hibernate 4.3.11。我正在使用Spring Data JPA。
我有一个实体,其中包含多个子实体集合@OneToMany
和@ManyToMany
。这就是模特 - 它不适合我爱或恨。
然后我有一个普通的CRUD UI,其中包含一个主实体表和一个编辑器,用户可以在其中为子实体选择选项并保存主实体。
用Vaadin完成UI,并且涉及Web套接字。所以 - 不是正常的Http交换。
通过正常设置,我得到了#34;正常"来自Hibernate的LazyInitializationException。因为,一旦实体被加载到表格屏幕中,会话就会被关闭,因此,当在编辑器屏幕中调用集合时,我要么完全重新加载实体,哪种类型会杀死使用ORM的所有mojo,或者我尝试别的东西:
@Fetch(FetchMode=JOIN)
本来不应该在那里发生的事情)spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true
添加到我的启动配置中,这与第一个选项基本相同,变为默认值。不,谢谢。countingQuery
(没有连接获取),否则你会得到一个漂亮,清晰且易于调试的org.hibernate.QueryException: query specified join fetching, but the owner of the fetched association was not present in the select list
。另外,如果你忘了"要删除fetchType
或@OneToMany
注释中的@ManyToMany
选项,您会获得另一个令人毛骨悚然的例外:org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags
最后,切换到EclipseLink,它具有更明智的方法,只需在新的会话中请求子集合,似乎比Spring Boot通常提供的更多苦差事(有几个关于使用仪器代理运行应用程序的必要性仍在讨论中。
那么,最终,是否存在针对此问题的无黑客解决方案?
答案 0 :(得分:1)
使用hibernate有两种主要策略。
LazyInitializationException
) LazyInitializationException
向我们提供了您使用short-lived-session
的提示。
要么使用长期会话并使用MVC视图中的实体。 或您将实体中的所有值重新映射到非实体的新包装器。
我建议保留short-lived-session
策略并将所有值重新映射到pojos以供查看。因为:db-structure很少是前端所需的信息结构。例如:
您有两个实体:
但是在视图中你有这个Dataobject(DTO):
你知道,豆子是不同的,你不会在conn-close之后得到LazyInitializationException
。