Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate sessionFactory bean抛出java.lang.NullPointerException_Java_Spring_Hibernate - Fatal编程技术网

Hibernate sessionFactory bean抛出java.lang.NullPointerException

Hibernate sessionFactory bean抛出java.lang.NullPointerException,java,spring,hibernate,Java,Spring,Hibernate,我的应用程序在应用程序启动时与数据库良好交互,通过会话工厂成功创建hibernate会话,并提供输出 I am migrating jdbc to hibernate and i have palced below hibernate configuration in my application. public class HibernateConfiguration { @Bean public LocalSessionFactoryBean sessionFactory

我的应用程序在应用程序启动时与数据库良好交互,通过会话工厂成功创建hibernate会话,并提供输出

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;
    }

}
但在应用程序启动后,当我通过控制器点击DAO,然后会话工厂bean获取空引用并抛出NullPointerException,因此无法创建或打开hibernate会话,我试图找出解决方案,但这不起作用,请让我知道为什么上面的SessionFactory bean由于哪个问题产生了空指针


为了测试我的DAO逻辑,我使用了这个控制器,这个控制器命中了会话facorybean为null的DAO

**@Autowired
private SessionFactory sessionFactory;**

protected Session getSession() {
    return sessionFactory.getCurrentSession();
}
@RestController
@请求映射(“/Emp”)
公共类myController{
@RequestMapping(value=“/findByChannelManager”,method=RequestMethod.GET)
public void findemp(){
HotelDaoImpl HotelDaoImpl=新的HotelDaoImpl();
列表=新的ArrayList();
list=hotelDaoImpl.findByChannelManager(EnumCM.AR);
适用于(HotelEntity pro:列表){
System.out.println(pro);
}
}
}
@存储库
@交易的
公共类HotelDaoImpl扩展AbstractDao实现IHotelDao{
@SuppressWarnings({“未选中”、“未使用”})
@凌驾
公共列表FindByChannel Manager(EnumCM){
List=null;
试一试{
会话s=getSession();
标准=s.createCriteria(Hotel.class);
添加(Restrictions.eq(“channelManager”,“cm.name()”));
list=criteria.list();
}捕获(例外e){
debug(“错误”+e.getMessage());
e、 printStackTrace();
}
退货清单;
}
公共抽象类AbstractDao{
@自动连线
私人会话工厂会话工厂;
受保护会话getSession(){
返回sessionFactory.getCurrentSession();
}
}

您无法从控制器访问dao。您可以从服务访问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();
    }
    }
@RestController
@请求映射(“/Emp”)
公共类myController{
@自动连线
酒店服务;
@RequestMapping(value=“/findByChannelManager”,method=RequestMethod.GET)
public void findemp(){
列表=新的ArrayList();
list=service.findByChannelManager(EnumCM.AR);
适用于(HotelEntity pro:列表){
System.out.println(pro);
}
}
}
@服务
@交易的
公共级酒店服务{
@自动连线
道道私家酒店;
公共列表FindByChannel Manager(EnumCM){
返回dao.findByChannelManager(EnumCM);
}
}
@存储库
公共类HotelDaoImpl扩展AbstractDao实现IHotelDao{
@SuppressWarnings({“未选中”、“未使用”})
@凌驾
公共列表FindByChannel Manager(EnumCM){
List=null;
试一试{
会话s=getSession();
标准=s.createCriteria(Hotel.class);
添加(Restrictions.eq(“channelManager”,“cm.name()”));
list=criteria.list();
}捕获(例外e){
debug(“错误”+e.getMessage());
e、 printStackTrace();
}
退货清单;
}
公共抽象类AbstractDao{
@自动连线
私人会话工厂会话工厂;
受保护会话getSession(){
返回sessionFactory.getCurrentSession();
}
}

能否更新控制器类?能否在post中更新,
hotelDaoImpl=new hotelDaoImpl()
这可能是原因,也可以更新
findByChannelManager
方法代码also@RestController@RequestMapping(“/Emp”)公共类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逻辑,我正在使用这个控制器,这个控制器在会话facory bean为空的情况下命中DAO。您正在使用
new
关键字创建
HotelDaoImpl
,在
@controller
类中执行
@Autowired
HotelDaoImpl
@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();
    }
    }