Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java org.hibernate.LazyInitializationException:未能在另一个环境中延迟初始化角色集合_Java_Spring_Hibernate_Session_Transactionmanager - Fatal编程技术网

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

Java org.hibernate.LazyInitializationException:未能在另一个环境中延迟初始化角色集合,java,spring,hibernate,session,transactionmanager,Java,Spring,Hibernate,Session,Transactionmanager,你好 要知道这个标题是围绕堆栈溢出的,并且有多种解决方案 但是在这种情况下有一点不同,我不确定应该在哪里继续进行故障排除 在我的BaseUser.javaentity类中,我有以下代码: @SuppressWarnings("serial") @MappedSuperclass public abstract class BaseUser< T extends BasePasswordHistory > extends AuditModel implements ID

你好

要知道这个标题是围绕堆栈溢出的,并且有多种解决方案

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

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

@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...

}
BaseUserManagerImpl.java
仍处于相同的hibernate事务下,因此,它能够加载
passwordHistory
对象,即使是它的
延迟获取
类型。(如果我错了,请纠正我)

这些代码在原始环境中运行良好(命名为
enva
),直到我将相同的代码部署到另一个环境中(命名为
envb
),它将像标题一样点击
lazyiinitializationexception

我检查了WAS版本,发现版本有一些不同。

事实上,我不认为这就是为什么会发生异常。但是我真的不知道为什么相同的代码不能在不同的环境中工作。我还有什么需要进一步检查的吗

我在这里发布我的stacktrace:

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]
以下是守则的一部分:

public class ChangePasswordCommandHandler implements
        CommandHandler< ChangePasswordCommand, Integer > {

    @Autowired
    private UserManager userManager;

    public Integer execute(ChangePasswordCommand command)
            throws BaseException {

        return userManager.updatePassword( user, command.getNewPassword( ),
                command.isResetPWD( ) );
    }
}

@Service
public class UserManagerImpl extends
        BaseUserManagerImpl< User, PasswordHistory > implements
        UserManager {
    public int updatePassword(User user, String newPassword,
            boolean isResetPWD) throws BaseException {
         User entity = findById( user.getUserId( ) );
         final String newHash = getNewPasswordHash( entity, newPassword );
         entity = verifyPasswordHistory( entity, entity.getPassword( ),
                    newHash, isResetPWD );
         return 1;
     }
}

public abstract class BaseUserManagerImpl< T extends BaseUser< U >, U extends BasePasswordHistory >
        extends BaseManagerImpl< T, Long > implements BaseUserManager< T, U >,
        UserProfileService {
    final protected T verifyPasswordHistory(final T user, String oldHash,
            String newHash, boolean isResetPWD) {
        final int reuseNo = getMaxPassowrdhistory( );
        Set< U > histories = user.getPasswordHistories( );
        for ( U history : histories ) { // exception at this line in another environment
        }
    }
}
公共类ChangePasswordCommandHandler实现
CommandHandler{
@自动连线
私有用户管理器用户管理器;
公共整数执行(ChangePasswordCommand)
抛出BaseException{
返回userManager.updatePassword(user,command.getNewPassword(),
isResetPWD());
}
}
@服务
公共类UserManagerImpl扩展
BaseUserManagerImpl实现
用户管理器{
public int updatePassword(用户用户,字符串newPassword,
布尔值isResetPWD)引发BaseException{
用户实体=findById(User.getUserId());
最终字符串newHash=getNewPasswordHash(实体,newPassword);
entity=verifyPasswordHistory(entity,entity.getPassword(),
newHash,isResetPWD);
返回1;
}
}
公共抽象类BaseUserManagerImpl,U扩展BasePasswordHistory>
扩展BaseManagerImpl实现BaseUserManager,
用户档案服务{
最终受保护的T verifyPasswordHistory(最终T用户,字符串oldHash,
字符串newHash,布尔值isResetPWD){
final int reuseNo=getMaxPassowrdhistory();
Sethistories=user.getPasswordHistories();
对于(U历史记录:历史记录){//在另一个环境中此行出现异常
}
}
}

请告知。

您的方法应该是事务性的,至少是只读的。
您是否在top tour类或方法上使用@Transactional注释。

您的方法应该是事务性的,至少是只读的。
您是否在top tour类或方法上使用@Transactional annotation。

最后,我找到了这种情况的错误所在。该项目的WAS Java SDK指向Java 1.7。但是,代码是使用Java1.6编译的


我在检查
WAS classloader
目录时发现了这一点。将WAS控制台中的JavaSDK更改为Java1.7后,问题得到了解决

我终于找到了这个案子的症结所在。该项目的WAS Java SDK指向Java 1.7。但是,代码是使用Java1.6编译的


我在检查
WAS classloader
目录时发现了这一点。将WAS控制台中的JavaSDK更改为Java1.7后,问题得到了解决

您能发布整个stacktrace吗?@SimonMartinelli,只需添加stacktrace。您能显示ChangePasswordCommandHandler.execute.BankUserManagerImpl.updatePassword BaseUserManagerImpl的代码吗。verifyPasswordHistory@SimonMartinelli,刚刚添加到代码中。敬请告知。尝试将verifyPasswordHistory设置为非最终可不可以发布整个stacktrace?@SimonMartinelli,只需添加stacktrace。能否显示ChangePasswordCommandHandler.execute.BankUserManagerImpl.updatePassword BaseUserManagerImpl的代码。verifyPasswordHistory@SimonMartinelli,刚刚添加到代码中。敬请告知。尝试将verifyPasswordHistory设置为非最终版本,我使用spring AOP将所有类文件以*管理器结尾将是事务性的。否则它对环境A也不起作用。现在我的环境A起作用,但环境B不起作用,它们访问相同的数据库。是的,我使用spring AOP设置所有类文件end with*Manager将是事务性的。否则它对环境A也不起作用。现在我的环境A起作用了,但环境B不起作用了,它们正在访问同一个数据库。
public class ChangePasswordCommandHandler implements
        CommandHandler< ChangePasswordCommand, Integer > {

    @Autowired
    private UserManager userManager;

    public Integer execute(ChangePasswordCommand command)
            throws BaseException {

        return userManager.updatePassword( user, command.getNewPassword( ),
                command.isResetPWD( ) );
    }
}

@Service
public class UserManagerImpl extends
        BaseUserManagerImpl< User, PasswordHistory > implements
        UserManager {
    public int updatePassword(User user, String newPassword,
            boolean isResetPWD) throws BaseException {
         User entity = findById( user.getUserId( ) );
         final String newHash = getNewPasswordHash( entity, newPassword );
         entity = verifyPasswordHistory( entity, entity.getPassword( ),
                    newHash, isResetPWD );
         return 1;
     }
}

public abstract class BaseUserManagerImpl< T extends BaseUser< U >, U extends BasePasswordHistory >
        extends BaseManagerImpl< T, Long > implements BaseUserManager< T, U >,
        UserProfileService {
    final protected T verifyPasswordHistory(final T user, String oldHash,
            String newHash, boolean isResetPWD) {
        final int reuseNo = getMaxPassowrdhistory( );
        Set< U > histories = user.getPasswordHistories( );
        for ( U history : histories ) { // exception at this line in another environment
        }
    }
}