org.hibernate.LazyInitializationException:无法在另一个环境中延迟初始化角色集合

时间:2019-06-26 08:00:09

标签: java spring hibernate session transactionmanager

美好的一天,

知道这个标题是关于堆栈溢出的,并且还有多种解决方案。

但是这种情况有些不同,我不确定应该在哪里继续进行故障排除。

在我的BaseUser.java实体类中,我有以下代码:

@SuppressWarnings("serial")
@MappedSuperclass
public abstract class BaseUser< T extends BasePasswordHistory > extends
        AuditModel implements IDeletable, IEditable, UserProfile {

// some other code here...
        @OneToMany(cascade = { CascadeType.ALL }, mappedBy = "user")
        @OrderBy("passwordHistoryId desc")
        public Set< T > getPasswordHistories() {
            return passwordHistories;
        }
// some other code here...

}

以下是我称为ManagerImpl级别BaseUserManagerImpl.java的密码历史记录的一部分代码。

 Set< T > histories = user.getPasswordHistories( );
 for ( T history : histories ) { // exception at this line in another environment
 }

BaseUserManagerImpl.java仍处于同一休眠事务下,因此,它甚至可以加载passwordHistory类型的lazy fetch对象。 (如果我错了,请纠正我)

这些代码在原始环境中可以正常工作(将其命名为env A),直到我将相同的代码部署到另一个环境中(将其命名为env B),它会命中{{1 }}之类的标题。

我检查WAS版本,发现该版本有一些不同。 enter image description here

实际上,我认为这些是造成例外的原因。但是我真的不知道为什么相同的代码不能在不同的环境中工作。有什么需要进一步检查的地方吗?

我在这里发布我的堆栈跟踪:

LazyInitializationException

以下是代码的一部分:

2019-06-25 17:17:47.967 [WebContainer : 3] ERROR c.c.i.c.c.u.e.ExceptionHandler - [cvmaker123] - Exception occurred
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.cv.ibs.cib.support.entity.BankUser.passwordHistories, no session or session was closed
    at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:380) ~[hibernate-core-3.3.1.GA.jar:3.3.1.GA]
    at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:372) ~[hibernate-core-3.3.1.GA.jar:3.3.1.GA]
    at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:365) ~[hibernate-core-3.3.1.GA.jar:3.3.1.GA]
    at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:108) ~[hibernate-core-3.3.1.GA.jar:3.3.1.GA]
    at org.hibernate.collection.PersistentSet.iterator(PersistentSet.java:186) ~[hibernate-core-3.3.1.GA.jar:3.3.1.GA]
    at com.cv.ibs.cib.common.service.impl.BaseUserManagerImpl.verifyPasswordHistory(BaseUserManagerImpl.java:241) ~[com.cv.ibs.cib.jar:na]
    at com.cv.ibs.cib.support.service.impl.BankUserManagerImpl.updatePassword(BankUserManagerImpl.java:288) ~[com.cv.ibs.cib.jar:na]
    at com.cv.ibs.cib.support.service.impl.BankUserManagerImpl.updatePassword(BankUserManagerImpl.java:1) ~[com.cv.ibs.cib.jar:na]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.7.0]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:95) ~[na:1.7.0]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:56) ~[na:1.7.0]
    at java.lang.reflect.Method.invoke(Method.java:620) ~[na:2.6 (10-05-2016)]
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:309) ~[org.springframework.aop-3.0.4.RELEASE.jar:3.0.4.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183) ~[org.springframework.aop-3.0.4.RELEASE.jar:3.0.4.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) ~[org.springframework.aop-3.0.4.RELEASE.jar:3.0.4.RELEASE]
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89) ~[org.springframework.aop-3.0.4.RELEASE.jar:3.0.4.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) ~[org.springframework.aop-3.0.4.RELEASE.jar:3.0.4.RELEASE]
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) ~[org.springframework.aop-3.0.4.RELEASE.jar:3.0.4.RELEASE]
    at com.sun.proxy.$Proxy464.updatePassword(Unknown Source) ~[na:na]
    at c.c.i.c.app.profile.command.ChangePasswordCommandHandler.execute(ChangePasswordCommandHandler.java:42) ~[com.cv.ibs.cib.jar:na]

请告知。

2 个答案:

答案 0 :(得分:0)

您的方法至少应具有事务性(只读)。 您是否在顶级旅游类或方法上使用@Transactional注释。

答案 1 :(得分:0)

最后,我发现这种情况出了什么问题。该项目的WAS Java SDK指向Java 1.7。但是,该代码是使用Java 1.6编译的。

我在检查WAS classloader目录时发现了这一点。将WAS控制台中的Java SDK更改为Java 1.7之后,问题得以解决。