我已经开始学习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文件片段:
我认为我不需要包含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)
答案 0 :(得分:2)
您的sessionFactory
变量被误导性命名,因为该类型实际上是Session
。 Session
!= 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);
请注意,我使用的是接口类型,而不是具体类型。由于种种原因,这一直是一种可取的做法。
这(不是春天开始)是你的第一个问题。一旦这样做,您将遇到配置的其他问题。如果您需要帮助解决其中一个问题,您应该发布一个新问题。
答案 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)
}
}