dingvictory
dingvictory
2009-11-13 12:49
浏览 394
已采纳

getHibernateTemplate()为NUll,困扰好几天了,网上也找了好些方法一直解决不掉

小弟刚刚开始学SSH,是用的Struts2+Hibernate+Spring,运行的时候发现getHibernateTemplate()得到的模板类始终是nUll值,郁闷好几天了,一直在我网上试各种方法,迄今任为解决,恳请各位指教咯!

[size=large][b]applicationContext.xml:([/b]事务处理这儿没贴出来)[/size]
[code="java"]
<?xml version="1.0" encoding="UTF-8"?>
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">

<!-- 定义数据源 -->

class="org.apache.commons.dbcp.BasicDataSource">
value="com.mysql.jdbc.Driver">




<!-- 定义Hibernate的sessionFactory -->   
<bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource">
        <ref bean="dataSource" />
    </property>

    <!-- Hibernate  的sessionFactory的属性 -->

    <property name="hibernateProperties">       
        <props>
            <!-- 数据库方言 -->
            <prop key="hibernate.dialect">
                org.hibernate.dialect.SQLServerDialect
            </prop>
            <!-- 显示Hibernate持久化操作所生成的SQL语句 -->
            <prop key="hibernate.show_sql">true</prop>
            <!-- 将SQL脚本进行格式化后再输出 -->
            <prop key="hibernate.format_sql">true</prop>            
        </props>
    </property>
    <!-- 列出全部的映射文件 -->
    <property name="mappingResources">
        <list>                      
            <value>com/jjufriend/student/model/Student.hbm.xml</value></list>
    </property></bean>

<!-- 配置dao组件 -->
<bean id="studentDao"
    class="com.jjufriend.student.dao.impl.StudentDaoHibernate">
    <!-- 依赖注入DAO组件所必需的SessionFactory引用 -->
    <property name="sessionFactory" ref="sessionFactory">
    </property>
</bean>
<!-- 配置业务逻辑组件 -->
<bean id="mgr"
    class="com.jjufriend.student.service.impl.StudentManagerImpl">
    <property name="studentDao" ref="studentDao"></property>
</bean>
[/code]

[size=large]studentDao.java:[/size]
[code="java"]package com.jjufriend.student.dao;

import java.util.List;

import com.jjufriend.student.model.Student;

public interface StudentDao {

Student get(Integer id);

Integer save(Student student);

void update(Student student);

void delete(Student student);

void delete(Integer id);

List<Student> findAll();

Student findStudentByNameAndPass(String username,String password);

Student findByName(String username);

}[/code]

[size=large]StudentDaoHibernate.java:[/size]
[code="java"]package com.jjufriend.student.dao.impl;

import java.io.Serializable;
import java.util.List;

import org.hibernate.SessionFactory;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import com.jjufriend.student.dao.StudentDao;
import com.jjufriend.student.model.Student;

public class StudentDaoHibernate extends HibernateDaoSupport implements
StudentDao,Serializable {
private SessionFactory sessionFactory;

HibernateTemplate ht = this.getHibernateTemplate() ;

public void delete(Student student) {
    // TODO Auto-generated method stub
    getHibernateTemplate().delete(student);

}

public void delete(Integer id) {
    // TODO Auto-generated method stub
    getHibernateTemplate().delete(get(id));

}

public List<Student> findAll() {
    // TODO Auto-generated method stub
    return (List<Student>)getHibernateTemplate().find("from Student");

}

public Student findByName(String username) {

    List stu =  getHibernateTemplate().find("from Student st where st.username = ?",username);

    if(stu != null && stu.size() >= 1){
        return (Student)stu.get(0);
    }

    return null;
}

public Student findStudentByNameAndPass(String username, String password) {
    // TODO Auto-generated method stub
    List students = null;
    try{

    //  HibernateTemplate temple = this.getHibernateTemplate();

System.out.println("模板类是否为NULL>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"+ht);

// 取出所有 students = temple.find("from student");
students = ht.find("from student st where st.username = " + username + " and st.password = " + password);

    }catch(Exception  e){
        System.out.println("查找过程中出现异常..............");
        e.printStackTrace();
    }
    if(students != null && students.size() >= 1){
        return (Student)students.get(0);
        }
    return null;
}

public Student get(Integer id) {

    return (Student)getHibernateTemplate().get(Student.class, id);

}

public Integer save(Student student) {
    return (Integer)getHibernateTemplate().save(student);
}

public void update(Student student) {
    // TODO Auto-generated method stub
    getHibernateTemplate().update(student);

}

}
[/code]
[size=large]StudentManager.java:[/size]
[code="java"]package com.jjufriend.student.service;

import com.jjufriend.student.model.Student;

public interface StudentManager {

int addStudent(Student student) throws Exception;

int loginValid(Student student) throws Exception;

boolean validateName(String username) throws Exception;

}
[/code]

[size=large]StudentManagerImpl.java:[/size]
[code="java"]package com.jjufriend.student.service.impl;

import com.jjufriend.student.dao.StudentDao;
import com.jjufriend.student.dao.impl.StudentDaoHibernate;
import com.jjufriend.student.model.Student;
import com.jjufriend.student.service.StudentManager;

public class StudentManagerImpl implements StudentManager {
/*2009-11-12 22:44修改 出去new StudentDaoHibernate() */
private StudentDao studentDao = new StudentDaoHibernate() ;

// private ApplicationContext cxt =
// new FileSystemXmlApplicationContext("../webapps/JJUFriend/WEB-INF/applicationContext.xml");
// studentDao =(StudentDaoHibernate)cxt.getBean("studentDao");

public void setStudentDao(StudentDao studentDao){

    this.studentDao = studentDao ;
}


public int addStudent(Student student) throws Exception {
    // TODO Auto-generated method stub
    try{
        studentDao.save(student);
        return student.getId();

    }catch(Exception e){
        e.printStackTrace();
        throw new Exception("新增用户时出现异常");
    }

}

public int loginValid(Student student) throws Exception {
    try{

System.out.println(studentDao);
System.out.println("是否取到页面提交的数据:Name="+student.getUsername());
Student stu = studentDao.findStudentByNameAndPass(student.getUsername(), student.getPassword());
if(stu != null ){
return stu.getId();
}

    }catch(Exception e){        
        System.out.println("验证用户登录时出现异常");
        e.printStackTrace();
    }

    // TODO Auto-generated method stub
    return -1;
}

public boolean validateName(String username) throws Exception {
    // TODO Auto-generated method stub
    try{
        if (studentDao.findByName(username) != null){
            return true ;
        }


    }catch(Exception e){
        System.out.println("验证用户名是否用效时出错");
        e.printStackTrace();

    }
    return false ; 

}

}
[/code]

问题的关键是通过方法getHibernateTemplate()不能正确得到HibernateTemplate对象,始终的空值,网上有很多解决的办法,差不多我都试过了,

下面这种方法是说不能直接new StudentDao对象,用下面这种方法取得,可以启动服务器老是不停地跳动,一直不停,直到报错。
[code="java"]
// private ApplicationContext cxt =
// new FileSystemXmlApplicationContext("../webapps/JJUFriend/WEB-INF/applicationContext.xml");
// private StudentDao studentDao =(StudentDaoHibernate)cxt.getBean("studentDao");[/code]

还有些方法是直接从applicationContext.xml中的bean取得HibernateTemplate对象,始终都搞不定,望大家指教了。

[size=medium](顶格的System.out.println()语句均是测试用的语句)[/size]

[b]问题补充:[/b]
谢谢大家的热心帮助!!

确实其中出了不少问题,主要是最近网上看到解决这个方法的帖子很多,尝试过很多方法,都有点儿改晕了。

一楼的方法我尝试了,还是不行,[code="java"]
private ApplicationContext cxt = this.getApplicationContext();

private StudentDao studentDao = (StudentDaoHibernate)cxt.getBean("studentDao"); [/code]
其中那个this.getApplicationContext(); 方法根本不存在啊,无法取得配置文件。

之前类似的方法我也用过就是用[code="java"] private ApplicationContext cxt =

new FileSystemXmlApplicationContext("../webapps/JJUFriend/WEB-INF/applicationContext.xml");

private StudentDao studentDao =(StudentDaoHibernate)cxt.getBean("studentDao"); [/code]取得,但是当启动服务器后,后台一直跑个不停,仿佛是个死循环似的。浏览器中通过http://localhost:8080访问都无效!

StudentDaoHibernate.java中的private SessionFactory sessionFactory;已经去掉

数据库方言也该过来了

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

9条回答 默认 最新

  • flybar0015
    flybar0015 2009-11-13 13:45
    已采纳

    我大至看了一下,个人感觉有两点不对:

    1、StudentManagerImpl.java中的
      private StudentDao studentDao = new StudentDaoHibernate() ; 
     不应该new ,直接 = null 就可以。因为你已经使用了spring的注入。
    
    2、StudentDaoHibernate.java中的
      private SessionFactory sessionFactory;应该去掉。     
     HibernateTemplate ht = this.getHibernateTemplate() ;应该去掉。
     这两个是父类的属性,不需要你重载,也不该重载。即使你非要重载,那你也应该写上setter吧,要不spring找不到setter不还是会注入到父类中去么,所以你总是获得null。
    
    以上观点仅代表个人意见,如果说的不对,请批评和指正。
    
    点赞 评论
  • iteye_6376
    iteye_6376 2009-11-13 13:49

    [code="java"]
    private ApplicationContext cxt = this.getApplicationContext();
    private StudentDao studentDao = (StudentDaoHibernate)cxt.getBean("studentDao");
    [/code]

    studentDao 对象直接 new 的话里面是没有Hibernate上下文的。
    只能取得在配置文件中自动生成的实例

    点赞 评论
  • myali88
    myali88 2009-11-13 14:04

    [code="java"][/code]
    为什么你数据库用的是MySQL,而sessionFactory里的方言设置是[code="java"]

    org.hibernate.dialect.SQLServerDialect

    [/code],用的是SQLServer的,这肯定不行吧?!

    点赞 评论
  • myali88
    myali88 2009-11-13 14:25

    用[code="java"]org.hibernate.dialect.SQLServerDialect [/code]看来也是可以的,整个运行都没问题,没出现楼主说的问题

    点赞 评论
  • Ryankay
    Ryankay 2009-11-13 15:57

    楼主介个配置错误实在是太多了哦~

    1楼2楼3楼说的都对~

    你按照1楼说的做吧,分给1楼吧.

    点赞 评论
  • satanest
    satanest 2009-11-13 16:02

    楼主试下一楼的解决方法,个人觉得也是这样

    点赞 评论
  • Ryankay
    Ryankay 2009-11-13 16:53

    楼主,两个建议:
    1.仔细对照书籍,按照书上的例子做一遍。你的问题主要是SPRING相关的不熟悉,所以hibernate砍掉,直接spring加载普通的类。先把简单的配置成功,再把hibernate,struts加进来,一个一个来。
    2.出现问题一定要看控制台的信息,错误在哪行,是什么错误。

    从你上面的发言可以看出,有些基础的概念还没掌握比如
    ApplicationContext是什么?

    你可以通过new 指定xml文件地址,获得spring环境,也可以通过依赖注入,也可以使用getWebApplicationContext(),当然要使用这个需要继承Spring提供的ActionSupport。建议你找本专业点书籍看,SSH的东西,光在问答上还是说不清的。

    建议找本实战的书,什么 “深入浅出spring" struts+spring+hibernate集成。

    按照书上的例子走一遍。

    依赖注入需要为bean的变量提供setter。OVER...

    点赞 评论
  • iteye_6376
    iteye_6376 2009-11-13 17:24

    [code="java"] public class StudentManagerImpl implements StudentManager {

     private StudentDao studentDao ;  
    
     /**
      *这个方法是由 spring 自动调用的,只要定义了studentDao ,在类里放上   
    *getter/setter就不用管了
    
    • <bean id="mgr"
    • class="com.jjufriend.student.service.impl.StudentManagerImpl">


    • 这里的property -name -ref 会帮你做好
      */
      public void setStudentDao(StudentDao studentDao){

       this.studentDao = studentDao ;  
      

      }

      [/code]

    点赞 评论
  • iteye_6376
    iteye_6376 2009-11-13 17:33

    [code="java"] public class StudentManagerImpl implements StudentManager {

      private StudentDao studentDao ;    
      public static      StudentManagerImpl smi;
      public StudentManagerImpl()
      {
    

    smi = this;
    System.out.println("我自动生成了");
    }

      public void setStudentDao(StudentDao studentDao){    
          System.out.println("我自动调用了set方法");
          this.studentDao = studentDao ;    
      }    
    

    [/code]

    [code="java"]
    public class StudentDaoHibernate extends HibernateDaoSupport implements

    StudentDao,Serializable {

    private SessionFactory sessionFactory;

    public static HibernateTemplate ht ;

     public static StudentDaoHibernate  sdh;
    

    public StudentDaoHibernate()
    {
    System.out.println("自动调用");
    ht = this.getHibernateTemplate();
    sdh = this;
    }

    [/code]

    通过这两节代码你看看spring在地下偷偷干了啥

    StudentManagerImpl.smi 你看看是不是你要的东西

    不要直接new

    点赞 评论

相关推荐