数据模型定义如下:
学生-学生可以学习许多课程
课程-课程可以具有一组模块。模块组是 使用 group_key
模块-使用以下模块将模块定义和分组为单元 module_group_key ,并在课程中使用 group_key
引用@JoinColumn(name = "group_key", referencedColumnName = "module_group_key", updatable = false, insertable = false)
private List<Module> modules;
此组密钥用于避免具有ManyToMany映射表 COURSE_MODULE 。使用模块组键可以设置课程的模块列表。看起来工作正常,但当学生开设具有相同模块组的课程时,会引发异常。意味着不同的课程加载了相同的模块组。提早获取也会引发相同的异常。
org.hibernate.LazyInitializationException:无法延迟初始化 角色集合:Course.modules,无法初始化代理-否 会话
我认为在为学生的不同对象(课程)加载同一集合对象(模块)时出现问题。使用休眠4.3.10。是否可以不使用映射表来解决此问题?让我知道您对此有何想法。谢谢
答案 0 :(得分:0)
这似乎不是映射问题。当您尝试在打开的Hibernate会话之外访问实体(在这种情况下为课程)时,会遇到此异常。您应该保持会话开放,直到您完成与实体的合作。
通常,当会话管理在错误的层(例如,应用程序的数据访问层)中完成时,就会发生这种情况。在这种常见的反模式中,分别为每个查询创建会话(和事务)。