Java 静态变量中的关闭会话问题与Hibernate中的非静态会话问题
我正在写一个软件测试,我有一个我无法理解的异常。在我的应用程序中有一个用户类,用户数据将从数据库提供给单元测试。用户供应商已为此目的编写:Java 静态变量中的关闭会话问题与Hibernate中的非静态会话问题,java,static,hibernate-session,Java,Static,Hibernate Session,我正在写一个软件测试,我有一个我无法理解的异常。在我的应用程序中有一个用户类,用户数据将从数据库提供给单元测试。用户供应商已为此目的编写: public class UserSupplier { private static IUserRepository repository; static { try { IUnitOfWork unitOfWork = DependencyResolver.getVariable().resolve(IUn
public class UserSupplier {
private static IUserRepository repository;
static
{
try {
IUnitOfWork unitOfWork = DependencyResolver.getVariable().resolve(IUnitOfWork.class);
if(unitOfWork == null)
throw new NullPointerException(IUnitOfWork.class);
Session session = unitOfWork.getSession();
if(session == null)
throw new NullPointerException(Session.class);
// Line 20
System.out.println(" is session connected : "+ session.isConnected() + " " + Instant.now());
if(!session.isOpen())
throw new RuntimeException("closed session");
repository = new UserRepository(unitOfWork);
} catch (Exception hata) {
throw new ExceptionInInitializerError(hata);
}
}
// .. other codes
}
该类的主要目的是向用户提供其他测试方法。IUnitOfWork是基本数据库操作的接口,具体的IUnitOfWork类使用Hibernate的Session和SessionFactory类。junit中还有21个其他测试类,每当我将它们作为一个整体运行时,使用UserSupplier的测试类都会失败。失败的原因是“已关闭会话”异常。尽管我写了第20行,但输出指出会话是开放的,然而,关于封闭会话的具体类IUserRepository抱怨。每当我专门运行使用UserSupplier的测试时,它不会导致异常
当我更改UserSupplier时:
我没有将“repository”变量设置为静态变量,代码运行时不会出错。即使我这样解决了这个问题,我也无法理解第一段中异常的机制。你能解释一下为什么我在第一节课上得了异常吗
提前谢谢
public class UserSupplier {
private IUserRepository repository;
public UserSupplier()
{
this.assignRepository();
}
private void assignRepository()
{
try {
IUnitOfWork unitOfWork = DependencyResolver.getVariable().resolve(IUnitOfWork.class);
if(unitOfWork == null)
throw new NullPointerException(IUnitOfWork.class);
Session session = unitOfWork.getSession();
if(session == null)
throw new NullPointerException(Session.class);
// Line 20
System.out.println(" is session connected : "+ session.isConnected() + " " + Instant.now());
if(!session.isOpen())
throw new RuntimeException("closed session");
repository = new UserRepository(unitOfWork);
} catch (Exception hata) {
throw new ExceptionInInitializerError(hata);
}
}
}