我正在使用spring-mvc和hibernate session-factory。
@Controller
|
-> @Service (@Transactional)
|
-> @Repository
我有2个实体,User
和Address
。
用户List<Address>
FetchType=LAZY
。
如果我通过用户在Address
内添加了@Controller
个对象,我会获得failed to lazily initialize a collection of role - could not initialize proxy - no Session
例外。
但是,如果我在包含@Transactional
的服务层内执行此操作,则操作很有效。
我发现了hibernate代理,等等。
我的问题是,为什么@Controller
无法更改从@Service
图层重试的实体对象。因为@Controller
不知道它是否是一个休眠代理或其他任何东西。对于@Controller
它只是一个对象。那么,如果我在@Controller中更改实体对象,为什么我会收到错误。这仅发生在标记为FetchType=LAZY
的实体属性中。
答案 0 :(得分:2)
当你选择一个懒惰加载的属性时,hibernate将这些属性包装在具有获取父对象的会话对象的代理中。
如果您尝试在会话范围之后访问该属性,则会收到此错误。
您的会话似乎是在服务层中创建和关闭的。
实施 OpenSessionInView由Spring提供的过滤器,它将在发送响应后关闭会话。