0

我正在使用 OpenSessionInViewFilter。这是我的 web.xml 中的第一个过滤器

<filter>
    <filter-name>openSessionInViewFilter</filter-name>
    <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>openSessionInViewFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

这是我的 applicationContext.xml 的一部分

<bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory"/>
  </bean>

<bean id="userBc" class="com.tutorial.bc.auth.UserBcImpl">
    <property name="userDao">
      <ref local="userDao"/>
    </property>
  </bean>
...
<tx:annotation-driven transaction-manager="txManager"/>

我在 hbm 文件中的映射-

<set name="userCoachingRoles" table="user_coaching_role" lazy="true" cascade="all-delete-orphan">
      <key column="user_id"/>
      <many-to-many column="coaching_id" class="com.tutorial.entity.coaching.Coaching" lazy="proxy"/>
</set>

我获取用户的 userBc 中的方法带有注释,@Transactional并且我的实体 User 有一个方法getUserCoachingRoles。我遇到了这个方法的异常 -

org.hibernate.LazyInitializationException: could not initialize proxy - no Session

我无法理解为什么即使我使用OpenSessionInViewFilter. 需要帮助。

4

1 回答 1

1

你有没有机会getUserCoachingRoles在一个单独的线程中调用?如果是这样,这是预期的行为。

由于UserCoachingRoles没有立即加载,因此 Spring 无法访问该线程内的数据库连接,也无法加载它。你需要:

  • create an enclosing session wrapper in your thread;
  • pass the id of UserCoachingRoles to the thread instead of passing object and load the property inside this thread
于 2012-11-09T21:28:07.507 回答