2

我已经开始通过一项作业学习休眠和弹簧,在该作业中我试图通过弹簧使用会话工厂实例。我理解了休眠部分,但不能继续春天。我尝试了许多教程和示例,但无法让我的 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 文件的片段: 在此处输入图像描述

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

调用 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)
4

2 回答 2

2

你的sessionFactory变量被误导了,因为类型实际上是Session. Session!= SessionFactory。您正在使用 NPE,sessionFactory.getStatistics()因为 Spring 无法将 Session 自动装配到这样的 DAO 中。如果您在 NPE 之前没有看到错误,那么您实际上并没有使用 Spring 实例化 DAO,否则您会收到关于无法找到 Session 类型的依赖项的错误。使用基于 Hibernate 的 DAO 的适当方法是将其注入 aSessionFactorygetCurrentSession()在需要Session. 有关此方法和设置适当事务管理的详细信息,请参阅“基于普通 Hibernate 3 API 实现 DAO”和以下内容。

更新:再看一眼,我看到你的组件扫描包设置为com.nagarro.training.assignment6.dao.entity.Student,它看起来完全像一个类,而不是一个包。它甚至与您真正想要进行组件扫描的任何东西都不接近。也许你不明白组件扫描是干什么用的。它包含在参考指南中的“基于注释的容器配置”中。

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

ApplicationContext context = new FileSystemXmlApplicationContext(locationOfXmlFile);

然后,如果你想要一个 Spring 管理的 DAO,你不能只用new. 春天不是魔法。它不会因为您将它加载到同一个 JVM 中的某个位置而从您手中夺走控制权。* 您必须向 Spring 询问创建的 DAO,例如:

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

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

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

*除非您使用 AspectJ weaving 来注入任意对象

于 2013-03-04T05:19:33.657 回答
1

您在 DAO 类中注入 aSession而不是SessionFactorywith 。@Autowired private Session sessionFactory;它需要SessionFactory像这样 @Autowired SessionFactory sessionFactory;

然后像这样使用它来做一个DAO操作,比如save

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)
}
}
于 2013-03-04T05:50:49.043 回答