2

我是基于注释的事务管理的新手。我正在使用 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 类来执行任何查询,所以我使用的是加载方法:

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();
    }

现在我的问题是我的加载方法成功运行但是当在 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 但同样的问题。

4

1 回答 1

0

您必须了解有关 LazyInitialzation 异常的一件事。它发生在休眠无法初始化已设置为延迟获取的对象时,并且主要发生在包含设置为延迟获取的其他对象集的对象上的会话关闭时。

虽然将 fetch 设置为 EAGER 有效,但在涉及对象层次结构的某些情况下,它可能不起作用。例如:用户-->包含角色和角色集--> 包含权限集。现在,如果所有人都在延迟获取。如果我获取用户对象并关闭会话,然后尝试从中获取角色,我会得到异常。如果我在用户 POJO 中设置 fetch 渴望角色,我仍然会得到该异常,因为角色 POJO 包含延迟获取的权限。

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

事情会奏效:)

于 2012-12-18T13:35:08.947 回答