【发布时间】:2019-04-13 23:46:39
【问题描述】:
I am migrating jdbc to hibernate and i have palced below hibernate configuration in my application.
public class HibernateConfiguration {
@Bean
public LocalSessionFactoryBean sessionFactory() {
LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
sessionFactory.setDataSource(dataSource());
sessionFactory.setPackagesToScan(new String[] { "com.cm.models" });
sessionFactory.setHibernateProperties(hibernateProperties());
return sessionFactory;
}
@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl(jdbcurl);
dataSource.setUsername(userName);
dataSource.setPassword(password);
return dataSource;
}
private Properties hibernateProperties() {
Properties properties = new Properties();
properties.put("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
properties.put("hibernate.show_sql", true);
properties.put("hibernate.format_sql", true);
return properties;
}
@Bean
@Autowired
public HibernateTransactionManager transactionManager(SessionFactory s) {
HibernateTransactionManager txManager = new HibernateTransactionManager();
txManager.setSessionFactory(s);
return txManager;
}
}
我的应用程序在应用程序启动时与数据库交互良好,通过会话工厂成功创建休眠会话并提供输出。
**@Autowired
private SessionFactory sessionFactory;**
protected Session getSession() {
return sessionFactory.getCurrentSession();
}
但是在应用程序启动后,当我通过控制器点击 DAO 时,会话工厂 bean 获取 Null 引用并抛出 NullPointerException,由于无法创建或打开休眠会话,我试图找出解决方案,但那不起作用请告诉我上面的原因由于创建了哪个问题,SessionFactory bean 具有 nullPointer。
只是为了测试我的 DAO 逻辑,我正在使用这个控制器,并且这个控制器访问了 sessionFacory bean 为空的 DAO。
@RestController
@RequestMapping("/Emp")
public class myController {
@RequestMapping(value = "/findByChannelManager", method = RequestMethod.GET)
public void findemp() {
HotelDaoImpl hotelDaoImpl=new HotelDaoImpl();
List <HotelEntity> list = new ArrayList<>();
list = hotelDaoImpl.findByChannelManager (EnumCM.AR);
for (HotelEntity pro : list) {
System.out.println(pro);
}
}
}
@Repository
@Transactional
public class HotelDaoImpl extends AbstractDao implements IHotelDao {
@SuppressWarnings({ "unchecked", "unused" })
@Override
public List<HotelEntity> findByChannelManager(EnumCM cm) {
List<HotelEntity> list = null;
try {
Session s = getSession();
Criteria criteria=s.createCriteria(Hotel.class);
criteria.add(Restrictions.eq("channelManager", "cm.name()"));
list = criteria.list();
}catch(Exception e) {
LOGGER.debug("error " +e.getMessage());
e.printStackTrace();
}
return list;
}
public abstract class AbstractDao {
@Autowired
private SessionFactory sessionFactory;
protected Session getSession() {
return sessionFactory.getCurrentSession();
}
}
【问题讨论】:
-
你能更新控制器类吗?
-
你可以在帖子中更新,
hotelDaoImpl=new HotelDaoImpl()这可能是原因,并且还要更新findByChannelManager方法代码 -
@RestController @RequestMapping("/Emp") public class myController { @RequestMapping(value = "/findByChannelManager", method = RequestMethod.GET) public void findemp() { HotelDaoImpl hotelDaoImpl=new HotelDaoImpl( ); List
list = new ArrayList(); list=hotelDaoImpl.findByChannelManager(EnumCM.AR); for (HotelEntity pro : list) { System.out.println(pro); } } } -
只是为了测试我的 DAO 逻辑,我正在使用这个控制器,并且这个控制器访问了 sessionFacory bean 为空的 DAO。
-
您正在使用
new关键字创建HotelDaoImpl,在@Controller类中执行@AutowiredHotelDaoImpl类