java - 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());
}
}
解决方案
问题不在于您的休眠配置,而在于您的依赖注入。
您正在手动创建 AppHibernateUtil 的单例(您正在调用new AppHibernateUtil()
),让 Spring 完成它的工作并使用(组件的默认范围是单例)注释 AppHibernateUtil @Component
,然后将其注入您的类中,您需要的会话在哪里。
推荐阅读
- javascript - React 组件没有根据异步调用的响应进行更新
- python - 在多个地方分割字符串Python
- javascript - 如何知道我在 Azure 认知服务语音合成 (TTS) 中使用了多少个字符?
- c# - .net core 3.1 分离模型之间的关系
- node.js - 剧作家拖放
- java - Spring Data JPA 规范 FETCH JOIN 问题
- react-native - 如何使用 Jest 测试 Modal (react-native) 是否可见?
- angular - 订阅和模板离子的问题
- mysql - Maria DB - 为 SQL 事件中的每一行执行存储过程
- python - How do I open an FTP directory so that I can use it the same way I could a normal directory?