整合Spring Hibernate时 this.getSession() 报空指针异常

关二爷 发布于 2012/09/13 17:10
阅读 7K+
收藏 0

小弟弟是新人,今天早上练习Spring-Hibernate整合 写DAO 时 this.getSession():报空指针异常 搞了4个小时了还是没搞定,各位大侠帮帮忙。这个是项目图

这个是User.hbm.xml配置:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
 <class name="com.hz.entity.User" table="cc_flagdata">
  <id name="id" type="java.lang.Integer" column="cloid" ></id>
  
  <property name="cloname" type="string" column="cloname"></property>
 </class>
</hibernate-mapping>

这个是schema.xml配置:

<?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:context="http://www.springframework.org/schema/context"
 xmlns:aop="http://www.springframework.org/schema/aop"
 xsi:schemaLocation="http://www.springframework.org/schema/beans
 http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
 http://www.springframework.org/schema/context
 http://www.springframework.org/schema/context/spring-context-2.5.xsd
 http://www.springframework.org/schema/aop
 http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
 
 <bean id="dataSource" destroy-method="close"
  class="org.apache.commons.dbcp.BasicDataSource">
  <property name="driverClassName"
   value="oracle.jdbc.driver.OracleDriver"></property>
  <property name="url"
   value="jdbc:oracle:thin:zt/zt@10.165.65.156:1521:orcl"></property>
  <property name="username" value="zt"></property>
  <property name="password" value="zt"></property>
  <property name="maxActive" value="10"></property>
  <property name="initialSize" value="2"></property>
  <property name="minIdle" value="2"></property>
  <property name="maxIdle" value="3"></property>
 </bean>
 <bean id="sessionFactory"
 class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
 
  <property name="dataSource" ref="dataSource"></property>
  <property name="mappingResources">
   <list>
    <value>com/hz/entity/User.hbm.xml</value>
   </list>
  </property>
  <property name="hibernateProperties">
   <props>
    <prop key="hibernate.dialect">
     org.hibernate.dialect.OracleDialect</prop>
    <prop key="hibernate.show_sql">true</prop>
    <prop key="hibernate.format_sql">true</prop>
   </props>
  </property>
 </bean>
 <bean id="hibernateUserDao" class="com.hz.dao.HibernateUserDAO">
  <property name="sessionFactory" ref="sessionFactory"></property>
 </bean>
</beans>

这个是DAO 的代码:

public class HibernateUserDAO extends HibernateDaoSupport {

 public  List getCloname() {
  Session session =  (Session) this.getSession();
  System.out.println(session);
  
  try {
   Query query = (Query) session.createQuery("from user");
   List list = query.list();
   return list;
  } catch (HibernateException e) {
   e.printStackTrace();
   return null;
  }

 }
 public static void main(String[] args) {
  HibernateUserDAO dao = new HibernateUserDAO();
  List<User> list = dao.getCloname();
  for(User user:list){
   System.out.println(user);
  }
 }

main方法测试就报如下异常:

Exception in thread "main" java.lang.NullPointerException
 at org.springframework.orm.hibernate3.support.HibernateDaoSupport.getSession(HibernateDaoSupport.java:141)
 at com.hz.dao.HibernateUserDAO.getCloname(HibernateUserDAO.java:16)
 at com.hz.dao.HibernateUserDAO.main(HibernateUserDAO.java:32)

小弟第一次注册,第一次发帖,各位大哥都是猛人,帮忙搂一眼。这异常搞不定中午饭都没吃下哎。

要是发错地方了,摆脱别删,解决了再删吧 3Q。

 

加载中
0
sxgkwei
sxgkwei

不用顶了,哥告诉你,你这是概念不清。

首先你这种写法,明显是web,所以,你要简单的测试,就要启动web,然后通过前台地址一直调用到后台来,才能不NullPointerException。

原因很简单:你这个main的测试是“单机版”,你直接这么写,web不启动,spring容器就不会启动,没有容器,就不会有bean,就不会去读取你的配置文件,没有配置文件,你说,你的HibernateUserDAO哪儿来的sessionFactory?没有sessionFactory,你this.getSession()凭什么不报错?

如果硬要测试DAO层而不用启动web也不是不可以,Junit就是很好的工具,但是明显你没有在junit里面测试,而是自己写main,你以为单机版啊?

0
关二爷

这 SessionFactory我也配了 怎么DAO 那边就是空指针呢.

0
关二爷
哪位爷帮忙看看啊!!!!!!!
0
关二爷
自己顶哎 顶到解决后
0
sxgkwei
sxgkwei

同时我再多说一句,你即使可以调用到了,你写的代码也有严重资源问题。session只知道拿来用,用完就不管的啊?这样的写法,单机测试功能没问题,一发布成网站产品,用的人一多,直接资源耗尽,数据库失去响应。

http://www.oschina.net/code/snippet_176115_11688

我写的一个,你可以借鉴下。

 

0
关二爷

引用来自“sxgkwei”的答案

同时我再多说一句,你即使可以调用到了,你写的代码也有严重资源问题。session只知道拿来用,用完就不管的啊?这样的写法,单机测试功能没问题,一发布成网站产品,用的人一多,直接资源耗尽,数据库失去响应。

http://www.oschina.net/code/snippet_176115_11688

我写的一个,你可以借鉴下。

 

这位哥不知道你还会不会看到 先感谢您的回复,其实我用org.junit.Test测试过了有异常报的是:

java.lang.Exception: Method getCloname should be void
 at org.junit.internal.runners.MethodValidator.validateTestMethods(MethodValidator.java:77)
 at org.junit.internal.runners.MethodValidator.validateInstanceMethods(MethodValidator.java:28)
 at org.junit.internal.runners.MethodValidator.validateMethodsForDefaultRunner(MethodValidator.java:43)
 at org.junit.internal.runners.JUnit4ClassRunner.validate(JUnit4ClassRunner.java:36)
 at org.junit.internal.runners.JUnit4ClassRunner.<init>(JUnit4ClassRunner.java:27)
 at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
 at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
 at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
 at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
 at org.junit.internal.requests.ClassRequest.buildRunner(ClassRequest.java:33)
 at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:28)
 at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.<init>(JUnit4TestReference.java:29)
 at org.eclipse.jdt.internal.junit4.runner.JUnit4TestClassReference.<init>(JUnit4TestClassReference.java:25)
 at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:40)
 at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:30)
 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:452)
 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

忘记了贴出来,我正再写控制层测试、。能不能帮我看看到底是什么问题,我估计控制层写出来还有异常。

小弟是新人 基本上是看资料理解,不过不写代码都白扯啊,错啊错啊就会了,人都是在错误中成长的不是。

sxgkwei
sxgkwei
那是你junit的方法没写对的问题,这下就和你的配置什么的没关系了,junit怎么用,这个就不讨论了。
0
R-Lu
R-Lu

首先你得启动项目,这个是必须的.第二个,你的加载Spring的上下文,不是说Main不行,如果加载上下文也是可行的.JUnit其实就是帮你加载上下文的.

ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext-app.xml");

返回顶部
顶部