关于hibernate急迫加载问题(多重外键关联)
数据库结构如下
strategy中有外键member_id (关联member表) 外键strategy_category(关联category表) 而member表中有外键position_id (关联positons表)
如果前台页面直接查询stategy表中内容 我们hql语句如果这么写
String hql = "From Strategy where id = :id";
控制台会报no session错误 这是因为hibernate默认懒加载 只有我们需要的时候才会将关联的对象加载出来 这里在我们前台需要取关联对象中的属性的时候 session已经关闭了额 才会报这样的错误
那么如何解决呢
这里建议使用left join fetch的方式来加载对象 而不是将注解中默认的懒加载改为急迫加载 效率会很低
语句如下
Strategy strategy = (Strategy) sessionFactoryUtil.getSession()
.createQuery("From Strategy s left join fetch s.strategyCategory left join fetch s.member left join fetch s.member.positions where s.id = :id")
.setInteger("id", id).uniqueResult();
这里需要注意的是 因为关联的member表中又关联了positions表 所以需要一并加载出来 另一个需要注意的是这里的s.id必须这么写 因为这里的每张表的主键名都为id 如果不指明 系统无法辨识