可以直接实例化hibernate session Factory,但不能通过spring实现

时间:2013-03-04 05:01:00

标签: java spring hibernate

我已经开始学习hibernate并通过一个赋值弹出,我试图通过spring使用会话工厂实例。我理解了hibernate部分,但只是不能继续使用spring。我尝试过很多教程和例子但是我的春天不能工作。虽然它可以直接实例化它。 以下是我项目的问题相关细节......

applicationContext.xml (在WEB-INF内)

<?xml  version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:jee="http://www.springframework.org/schema/jee" xmlns:lang="http://www.springframework.org/schema/lang"
    xmlns:p="http://www.springframework.org/schema/p" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:util="http://www.springframework.org/schema/util"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd
        http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">

<context:annotation-config />
<context:component-scan
    base-package="com.nagarro.training.assignment6.dao.entity.Student" />



<bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="configLocation" value="classpath:hibernate.cfg.xml"></property>
    <property name="hibernateProperties">
        <value>
            hibernate.dialect=org.hibernate.dialect.HSQLDialect
        </value>
    </property>
</bean>
<bean id="transactionManager"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<tx:annotation-driven />

<bean id="studentDAO"
    class="com.nagarro.training.assignment6.dao.impl.StudentDAOImplementation">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>


</beans>

修改:包括建议的更改 StudentDAOImplementaion.java (使用它的文件)

public class StudentDAOImplementation implements StudentDAO {

    /**
     * single instance of hibernate session
     */
    @Autowired
    private SessionFactory sessionFactory;

    // HibernateUtil.getSessionFactory().openSession()

    /**
     * @param sessionFactory
     */
    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }

    /**
     * @return the sessionFactory
     */
    public SessionFactory getSessionFactory() {
        return sessionFactory;
    }

    private Session getSession() {
        return this.sessionFactory.getCurrentSession();
    }
        /**
     * @return list of all the students
     */
    public List<Student> getStudentList() {

        System.out.println(this.getSession().getStatistics());

        return (List<Student>) this.getSEssion.createQuery("from Student")
                .list();
    }

}

这是我在lib文件夹中的jar文件片段: enter image description here

我认为我不需要包含hibernate文件和bean,因为它没有弹簧工作正常。它的春天我无法工作。我尝试了很多不同的网络实现,但我无法让它工作。它只是说** System.out.println(sessionFactory.getStatistics())中的空指针异常; ** StudentDAOImplementation中的**行。

调用StudentDAO的测试类

public class Test {

public static void main(String[] args) {
    StudentDAOImplementation sd = new StudentDAOImplementation();

    List<Student> list = sd.getStudentList();

    for(Student s : list) {
        System.out.println(s.getName());
    }
}

}

堆栈跟踪

Exception in thread "main" java.lang.NullPointerException
    at StudentDAOImplementation.getStudentList(StudentDAOImplementation.java:116)
    at Test.main(Test.java:13)

2 个答案:

答案 0 :(得分:2)

您的sessionFactory变量被误导性命名,因为该类型实际上是SessionSession!= SessionFactory。你在sessionFactory.getStatistics()上获得了一个NPE,因为Spring无法将会话自动装入像这样的DAO。如果您在NPE之前没有看到错误,那么您实际上并没有使用Spring实例化DAO,否则您将收到一个错误,即无法找到Session类型的依赖项。使用基于Hibernate的DAO的适当方法是使用SessionFactory注入它,并在需要getCurrentSession()的方法中调用Session。有关此方法和设置适当的事务管理的详细信息,请参阅"Implementing DAOs based on plain Hibernate 3 API"及以下内容。

更新:第二眼,我看到组件扫描的软件包设置为com.nagarro.training.assignment6.dao.entity.Student,它看起来就像一个类,而不是一个软件包。它甚至都不是你想要进行分量扫描的任何东西。也许您不明白组件扫描的用途。它包含在参考指南中的"Annotation-based container configuration"下。

更新2:关于您的“测试”代码:您根本不使用Spring,因此您不妨删除XML并省去麻烦。另一方面,如果您想实际使用Spring,则需要根据所述XML文件在main方法中创建上下文,例如:

ApplicationContext context = new FileSystemXmlApplicationContext(locationOfXmlFile);

然后,如果你想要一个Spring管理的DAO,你不能只用new创建一个。春天不是魔术。它只是因为你把它加载到同一个JVM中的某个地方而没有把握你的控制权。*你必须向Spring询问创建的DAO,如:

StudentDAO dao = context.getBean(StudentDAO.class);

请注意,我使用的是接口类型,而不是具体类型。由于种种原因,这一直是一种可取的做法。

这(不是春天开始)是你的第一个问题。一旦这样做,您将遇到配置的其他问题。如果您需要帮助解决其中一个问题,您应该发布一个新问题。

*除非您是using AspectJ weaving to inject arbitrary objects

答案 1 :(得分:1)

您正在DAO类中注入Session而不是SessionFactory @Autowired private Session sessionFactory;。它必须是SessionFactory,就像这样  @Autowired SessionFactory sessionFactory;

然后像这样使用它来执行像保存

这样的DAO操作
Session session = sessionFactory.getCurrentSession()
session.persist(entity);

修改

你的测试用例应该是这样的

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:<path_to_your_appcontext.xml>" })
public class StudentDAOTest {

@Autowired
private StudentDAO studentDAO

@Test
public void test() {
      List<Student> list = studentDAO.getStudentList();
      assertNotNull(list)
}
}