fetchType.Lazy的问题......!

时间:2012-12-18 12:55:10

标签: spring hibernate spring-mvc

我是基于注释的事务管理的新手。我正在使用Spring 3.1,Hibernate 3.2开发Web应用程序。 我对@Transactional有一些问题。 我将加载具有子集的POJO如下: 父类是具有DealerMember集的DealerMaster,所以我声明为

DealerMaster中的

@OneToMany(fetch = FetchType.LAZY,mappedBy = "dealerMaster")
    @Cascade({ CascadeType.SAVE_UPDATE, CascadeType.DELETE_ORPHAN})
    public Set<DealerMember> getDealerMembers() {
        return this.dealerMembers;
    } 

我正在使用我的HibernateUtil类来执行任何查询,所以我使用的是load方法:

public static Object loadObject(Session paramSession, Object paramObject)
    throws Exception
  {
    try
    {       
      paramObject = paramSession.load(paramObject.getClass(), getId(paramObject));
    }
    catch (HibernateException localHibernateException)
    {
      setErrorMessage(paramObject, localHibernateException.getMessage());
      localHibernateException.printStackTrace();
    }

现在我的问题是我的load方法成功运行但是当在paramObject上移动courser时它会显示:

com.sun.jdi.InvocationException occurred invoking method.

只有当我尝试在控制器端访问它时,才能在服务层访问所有值,它会抛出错误:

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.lbt.model.DealerMaster.dealerMember, no session or session was closed

当我搜索相同的问题时,我发现这与延迟加载有关但我尝试了lazy = false也fetchType.Eager但同样的问题。

1 个答案:

答案 0 :(得分:0)

你必须了解一些关于LazyInitialzation异常的事情。当hibernate无法初始化已经设置为fetch lazy的对象时会发生这种情况,并且当包含设置为lazy的其他对象集合的对象关闭会话时,它会发生。取。

虽然将提取设置为EAGER可行,但在某些情况下,如果涉及对象的层次结构,则可能无效。 例如:用户 - &gt;包含一组角色和角色---&gt;包含权限集。 不,如果所有都是懒惰的提取。如果我获得用户对象并关闭会话然后尝试从中获取角色,我将获得异常。如果我在用户POJO中设置fetch急切的角色,我仍然得到该异常,因为角色POJO包含在lazy fetch上的权限。

因此,要么将所有层次结构设置为EAGER(有性能问题但会起作用)。 或者在完成对象处理后关闭会话(保持延迟提取)。

事情会有效:)