Null pointer error while using sessionfactory on H

2019-09-16 03:13发布

问题:

I'm struggling to figure out the exact problem, why the Null Pointer Error is thrown for Hibernate sessionFactory when I try to Auto wire sessionFactory from spring bean xml. Could somebody please help me out fix this. I'm new to Spring and deploying the app on Jboss server

Here is the Spring-Config.xml

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:c="http://www.springframework.org/schema/c"
    xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">

    <context:annotation-config />
    <context:component-scan base-package="org.kp.db.dao.impl" />


    <bean id="myDataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost:3306/ebm" />
        <property name="username" value="root" />
        <property name="password" value="root" />
    </bean>

    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="myDataSource" />
        <property name="configLocation" value="classpath:/hibernate.cfg.xml" />
    </bean>

    <tx:annotation-driven  transaction-manager="transactionManager" />

    <bean id="transactionManager"
        class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>
</beans>

Here is Hiberante.cfg.xml which I placed in webcontent folder

<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
  <session-factory>
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/ebm</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password">root</property>
    <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
    <property name="hibernate.show_sql">true</property>
    <property name="hibernate.hbm2ddl.auto">update</property>
    <mapping resource="org/kp/db/model/Actioncode.hbm.xml"/>
    <mapping class="org.kp.db.model.TblEBMFieldDetails"/>
    <mapping class="org.kp.db.model.TbleOLI"/>
  </session-factory>
</hibernate-configuration>

And the DAO class in which I'm trying to access the sessionFactory is

package org.kp.db.dao.impl;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.kp.db.dao.ActionCodeDao;
import org.kp.db.model.Actioncode;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

/**
 *
 * @author Administrator
 */
@Repository
public class ActionCodeDaoImpl implements ActionCodeDao{

    @Override
    public String[] getActionCodes() {
        throw new UnsupportedOperationException("Not supported yet.");
    }


    @Autowired(required=true)
    SessionFactory sessionFactory;

    public SessionFactory getSessionFactory() {
        return sessionFactory;
    }


    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }

    @Override
    @Transactional(readOnly=true,propagation=Propagation.REQUIRED)
    public String getActionCode(int id) {

        //ApplicationContext context;

        Session  session = sessionFactory.getCurrentSession();
        Actioncode actionCode=null;
        actionCode = (Actioncode)session.get(Actioncode.class, 1);

        return actionCode.getActionName();
    }

}

回答1:

@Named ("kpAction") 
public class Actions { 
    public String getActionCode() { 
        ActionCodeDao action =new ActionCodeDaoImpl(); 
        String str = action.getActionCode(1); System.out.println(str); return str; 
    } 
} 

When you run this line of code: ActionCodeDao action =new ActionCodeDaoImpl(); you get an object that is not managed by Spring and therefore will not contain the autowired dependencies.

I would say that is why you saw the null pointer.

However you say you have fixed it now, not sure if you inadvertantly changed this as well, if not im not sure how youve fixed it :)



回答2:

I've fixed the issue, instead of accessing the object I used the getter method and it worked, not sure what is the real concept behind it.

public String getActionCode(int id) {

    //ApplicationContext context;

    Session  session = getSessionFactory().getCurrentSession();
    Actioncode actionCode=null;
    actionCode = (Actioncode)session.get(Actioncode.class, 1);

    return actionCode.getActionName();
}