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