【问题标题】:Hibernate sessionFactory bean throwing java.lang.NullPointerException休眠 sessionFactory bean 抛出 java.lang.NullPointerException
【发布时间】: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 类中执行 @Autowired HotelDaoImpl

标签: java spring hibernate


【解决方案1】:

您无法从控制器访问 dao。您可以从服务访问 dao,因此添加服务类。试试这个代码

@RestController
        @RequestMapping("/Emp")
        public class myController {
@Autowired
HotelService service;
          @RequestMapping(value = "/findByChannelManager", method = RequestMethod.GET)
            public void findemp() {


                List <HotelEntity> list = new ArrayList<>();
                list = service.findByChannelManager (EnumCM.AR);
                for (HotelEntity pro : list) {
                    System.out.println(pro);
            }
        }
    }
@Service
@Transactional
public class HotelService {
@Autowired
private HotelDao dao;

public List<HotelEntity> findByChannelManager(EnumCM cm) {
   return dao.findByChannelManager(EnumCM cm);
}
}

@Repository
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();
    }
    }

【讨论】:

    猜你喜欢
    • 2012-12-18
    • 2016-06-28
    • 2017-02-06
    • 2012-01-23
    • 2016-03-21
    • 2013-06-11
    • 2015-06-10
    • 2013-03-09
    • 2014-01-10
    相关资源
    最近更新 更多