我对基于注释的事务管理很陌生。我正在用Spring3.1,Hibernate 3.2开发web应用程序。我对“交易”有一些问题。我将加载POJO,其子集合如下所示:父类是具有DealerMaster集的DealerMember,因此我声明为
in 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上移动跟踪器时,它显示:
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当我在googled上搜索相同的问题时,我发现这与延迟加载有关,但我尝试了懒惰= false,也尝试了fetchType.Eager,但问题是相同的。
发布于 2012-12-18 13:35:08
您必须了解关于LazyInitialzation异常的一件事,当hibernate无法初始化已设置为获取延迟的对象时,.It就会发生,并且通常是当会话关闭在包含设置为惰性获取的其他对象集的对象上时发生。
当将fetch设置为when时,在某些情况下,当涉及对象的层次结构时,它可能无法工作。例如:用户->包含角色和角色集->包含权限集。NOw,如果所有的都是懒散的抓取。如果我获得用户对象和关闭会话,然后尝试从其中获取角色,我将获得exception.If,我将在用户POJO中设置fetch渴望获得角色,但仍然会得到该异常,因为角色POJO包含在延迟获取上的权限。
因此,要么将层次结构中的所有内容设置为EAGER(有性能问题,但将有效)。或者在完成对对象的处理后关闭会话(保持延迟获取)。
事情会好起来的:)
https://stackoverflow.com/questions/13933532
复制相似问题