我是基于注释的事务管理的新手。我正在使用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但同样的问题。
答案 0 :(得分:0)
你必须了解一些关于LazyInitialzation异常的事情。当hibernate无法初始化已经设置为fetch lazy的对象时会发生这种情况,并且当包含设置为lazy的其他对象集合的对象关闭会话时,它会发生。取。
虽然将提取设置为EAGER可行,但在某些情况下,如果涉及对象的层次结构,则可能无效。 例如:用户 - &gt;包含一组角色和角色---&gt;包含权限集。 不,如果所有都是懒惰的提取。如果我获得用户对象并关闭会话然后尝试从中获取角色,我将获得异常。如果我在用户POJO中设置fetch急切的角色,我仍然得到该异常,因为角色POJO包含在lazy fetch上的权限。
因此,要么将所有层次结构设置为EAGER(有性能问题但会起作用)。 或者在完成对象处理后关闭会话(保持延迟提取)。
事情会有效:)