首页 > 解决方案 > NullPointerException 获取休眠会话

问题描述

我正在尝试将 Hibernate 5.2.12 集成到我的 Spring 应用程序中,但是在获取会话时得到了 nullPointerException。

这是休眠配置

@Configuration
@EnableTransactionManagement
public class HibernateConfig {

@Bean
public LocalSessionFactoryBean sessionFactory() {
    System.out.println("Session factory called!");
    LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
    sessionFactory.setDataSource(dataSource());
    sessionFactory.setPackagesToScan(
            "com.app.persistence.model");
    sessionFactory.setHibernateProperties(hibernateProperties());

    return sessionFactory;
}

@Bean
public DataSource dataSource() {

    BasicDataSource dataSource = new BasicDataSource();
    dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
    dataSource.setUrl("jdbc:mysql://localhost:3306/appDatabase?useSSL=false");
    dataSource.setUsername("root");
    dataSource.setPassword("password");

    return dataSource;
}

@Bean
public PlatformTransactionManager hibernateTransactionManager() {
    HibernateTransactionManager transactionManager
            = new HibernateTransactionManager();
    transactionManager.setSessionFactory(sessionFactory().getObject());

    return transactionManager;
}

private final Properties hibernateProperties() {
    Properties hibernateProperties = new Properties();
    hibernateProperties.setProperty(
            "hibernate.hbm2ddl.auto", "");
    hibernateProperties.setProperty(
            "hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");

    return hibernateProperties;
}

}

这是我的 util 类,其中 sessionFactory 是 @AutoWired

public class AppHibernateUtil {

private static final AppHibernateUtil instance = new AppHibernateUtil();

@Autowired
private SessionFactory sessionFactory;

public static Session getSession() {

    return getInstance().sessionFactory.openSession();
}

private static AppHibernateUtil getInstance() {
    return instance;
}

}

这是我尝试使用的会话

public static String getRoles() {

    System.out.println("Custom: getRoles() called");

    List<RoleEntity> roles = new ArrayList<>();

    try(Session session = AppHibernateUtil.getSession()){

        roles = session.createQuery("from RoleEntity").list();
    }

    return gson.toJson(roles.size());
}

public static void main(String args[]) {
    System.out.println(getRoles());
}

这里抛出空异常

return getInstance().sessionFactory.openSession();

这条线永远不会在控制台输出

System.out.println("Session factory called!");

如果我通过创建一个注入(或不注入)sessionFactory 的测试类来忽略 AppHibernateUtil 类。我得到相同的 NPE

@Component
public class TestController {

private static Gson gson = new Gson();

@Autowired
private static SessionFactory sessionFactory;

public static String getRoles() {

    System.out.println("Custom: getRoles() called");

    List<RoleEntity> roles = new ArrayList<>();

    try(Session session = sessionFactory.getCurrentSession()){

        roles = session.createQuery("from RoleEntity").list();
    }

    return gson.toJson(roles.size());
}

public static void main(String args[]) {
    System.out.println(getRoles());
}
}

标签: javaspringhibernate

解决方案


问题不在于您的休眠配置,而在于您的依赖注入。

您正在手动创建 AppHibernateUtil 的单例(您正在调用new AppHibernateUtil()),让 Spring 完成它的工作并使用(组件的默认范围是单例)注释 AppHibernateUtil @Component,然后将其注入您的类中,您需要的会话在哪里。


推荐阅读