Hibernate - 无法初始化代理 - 没有会话

时间:2015-02-02 03:34:17

标签: hibernate spring-mvc

我正在使用spring-mvc和hibernate session-factory。

@Controller
    |
    ->  @Service (@Transactional)
            |
            -> @Repository

我有2个实体,UserAddress

用户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的实体属性中。

1 个答案:

答案 0 :(得分:2)

当你选择一个懒惰加载的属性时,hibernate将这些属性包装在具有获取父对象的会话对象的代理中。

如果您尝试在会话范围之后访问该属性,则会收到此错误。

您的会话似乎是在服务层中创建和关闭的。

实施 OpenSessionInView由Spring提供的过滤器,它将在发送响应后关闭会话。