假设Student对Team是多对一的关系,并且<many-to-one>采取的是默认的加载策略(也即proxy)。那么,在session中取得Student后,在session外通过Student取出Team会发生什么情况呢?分三种情况讨论:
1.student记录对应的team_id为null。注意:是为null,而不是为""。下面为student表情况:
id stuName age team_id
123abc tom 24 null
这个时候调用:
log.info(stu.getTeam())打印的是“null”。
2. student记录对应的team_id有值,但这个值并没有对应到任何的实体team,比如随便给team_id设一个值“abcd123adfsdaf”。
id stuName age team_id
123abc tom 24 abcd123adfsdaf
这个时候调用:
log.info(stu.getTeam())
弹出异常:“could not initialize proxy - the owning Session was closed”
log.info(stu.getTeam().getClass())
打印的是“class com.model.Team$$EnhancerByCGLIB$$ee64f4f1”。
log.info(stu.getTeam().getId())
打印的是“abcd123adfsdaf”
log.info(stu.getTeam().getTeamName())
弹出异常:“could not initialize proxy - the owning Session was closed”
3. student记录对应的team_id有值,而且这个值对应到了一个实体team。
id stuName age team_id
123abc tom 24 402821f90cae6c2b010cae6c31f90001
这个时候调用:
log.info(stu.getTeam())
弹出异常:“could not initialize proxy - the owning Session was closed”
log.info(stu.getTeam().getClass())
打印的是“class com.model.Team$$EnhancerByCGLIB$$ee64f4f1”。
log.info(stu.getTeam().getId())
打印的是“402821f90cae6581010cae6588880001”
log.info(stu.getTeam().getTeamName())
弹出异常:“could not initialize proxy - the owning Session was closed”
从上可以看到第2和第三种情况的测试结果是完全一样的,具体的原因比较简单,在此就不再多说。
不过有的时候“多对一”的“一”这端可以为null,因此就可以用以下的语句判断:
if(student.getTeam()==null)
log.info(“team为null”);
else{
Hibernate.initialize(student.getTeam());//这段代码是伪码,我只是想表达这个意思。
log.info(student.getTeam().getTeamName());
}