我想知道:FetchType.LAZY
在一个(多)对多中使用 DAO 模式有什么意义?基本没用?一旦您在 DAO 之外(例如,实际工作是否完成),您就无法获取相关数据,因为您不再处于休眠会话中。
让我们举个例子:
Student
和Class
。一个学生上很多课。他现在登录系统并从系统中检索他的学生实体对象。
application layer -> Service Layer -> DAO
现在学生想看看他参加了哪些课程,并且LazyInitializationException
因为我们在 DAO 之外而发生了 oops a。
有哪些方法可以防止这种情况?我喜欢用谷歌搜索时间,但没有找到解决方案,除了在离开 DAO 之前实际获取所有内容,这首先违背了懒惰的目的。(已阅读,OpenSessionViewFilter
但这应该独立于应用程序层)
你如何以一种好的方式解决这个问题?什么是不受此影响的替代模式?
编辑:
我没有LazyInitializationException
以下设置:
@OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.compound",
cascade = CascadeType.ALL, orphanRemoval = true)
@Fetch(FetchMode.JOIN)
有趣的是它一定是这样的。
删除@Fetch
->LazyInitializationException
更奇怪的是,如果我删除了orphanRemoval = true
,那么LazyInitializationException
也会出现@Fetch
。所以这两个都是必需的。
也许有人可以启发我为什么会这样。目前,我倾向于完全放弃休眠,就像使用纯 JDBC 一样,我会在几小时前达到预期的行为......