1. 环境:
- spring4
- hibernate4
- mysql 5.6
2. 原始问题现象:
假设有两个表student和teacher,teachet是student的ManyToOne外键字段,设置如下属性:
@OneToOne(fetch = FetchType.LAZY, mappedBy = "student")
当没有在spring配置的transaction中直接如此:student.getTeacher()获取teacher时,会发生spring4 org.hibernate.LazyInitializationException: could not initialize proxy - no Session异常;
3. 原因分析:
spirng整合hibernate时,由于数据库的session完全交由spirng负责,而spring对于session的管理是以transaction为原子操作的,即在一个transaction事务操作完毕后session被spring关闭,所以在transaction的方法以外直接读取lazy加载字段时,session必然已经关闭了,进而抛出以上异常;