java.lang.NullPointerException 调用数据源



我有库模块,我想用它来存储休眠模型。我问有我想使用的春季战争包。

主春战:

@Configuration
@EnableTransactionManagement
public class ContextDatasource {
@Bean
public LocalSessionFactoryBean sessionFactory() throws NamingException {
final LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
sessionFactory.setDataSource(dataSource());
sessionFactory.setPackagesToScan(new String[] { "org.plugin.database.models" });
sessionFactory.setHibernateProperties(hibernateProperties());
return sessionFactory;
}
@Bean
public DataSource dataSource() throws NamingException {
return (DataSource) new JndiTemplate().lookup("java:/global/production_gateway");
}
@Bean
public PlatformTransactionManager hibernateTransactionManager() throws NamingException {
final HibernateTransactionManager transactionManager = new HibernateTransactionManager();
transactionManager.setSessionFactory(sessionFactory().getObject());
return transactionManager;
}
@Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
return new PersistenceExceptionTranslationPostProcessor();
}
private final Properties hibernateProperties() {
final Properties hibernateProperties = new Properties();
return hibernateProperties;
}
}

图书馆道:

public class BlacklistsDaoHibernate implements BlacklistsDao {
Session session;
@Autowired
SessionFactory sessionFactory;
public BlacklistsDaoHibernate() {
session = sessionFactory.getCurrentSession();
}
@Override
public void saveOrUpdate(BlacklistsModel blacklistsModel) throws Exception {
try {
session.getTransaction().begin();
session.saveOrUpdate(blacklistsModel);
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
throw new Exception("Error");
}
}

但我在这一行得到NPEsession = sessionFactory.getCurrentSession();

在库 Jar 模块中使用 sessionFactory 的正确方法是什么?

您可以使用@PostConstruct或构造函数注入。Spring 实例化你的对象,然后解析它的@Autowired字段。您可以要求它在通过构造函数注入实例化对象之前解析对象的依赖项。

使用构造函数注入:

SessionFactory sessionFactory;
Session session;
public BlacklistsDaoHibernate(@Autowired SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
this.session = sessionFactory.getCurrentSession();
}

使用@PostConstruct:

@Autowired
SessionFactory sessionFactory;
Session session;
@PostConstruct
void init() {
this.session = sessionFactory.getCurrentSession();
}

编辑:如果您的目标只是解决注释中提到的NullPointerException,请改用以下内容:

@PostConstruct
void init() {
this.session = sessionFactory.openSession();
}

有一个SessionFactory在 https://www.java2novice.com/hibernate/session-factory 的典型用法示例。

最新更新