您的位置:首页 > 其它

getHibernateTemplate()为NUll

2014-08-26 17:28 330 查看


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

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

applicationContext.xml:事务处理这儿没贴出来)

Java代码

<?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: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
10. http://www.springframework.org/schema/aop
11. http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
12.
<!-- 定义数据源 -->

13.
<bean id="dataSource"

14.
class="org.apache.commons.dbcp.BasicDataSource">

15.
<property name="driverClassName"

16.
value="com.mysql.jdbc.Driver">

17.
</property>

18.
<property name="url" value="jdbc:mysql://localhost:3306/jjufriend"></property>

19.
<property name="username" value="root"></property>

20.
<property name="password" value="root"></property>

21.
</bean>

22.

23.
<!-- 定义Hibernate的sessionFactory -->

24.
<bean id="sessionFactory"

25.
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

26.
<property name="dataSource">

27.
<ref bean="dataSource" />

28.
</property>

29.

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

31.

32.
<property name="hibernateProperties">

33.
<props>

34.
<!-- 数据库方言 -->

35.
<prop key="hibernate.dialect">

36.
org.hibernate.dialect.SQLServerDialect

37.
</prop>

38.
<!-- 显示Hibernate持久化操作所生成的SQL语句 -->

39.
<prop key="hibernate.show_sql">true</prop>

40.
<!-- 将SQL脚本进行格式化后再输出 -->

41.
<prop key="hibernate.format_sql">true</prop>

42.
</props>

43.
</property>

44.
<!-- 列出全部的映射文件 -->

45.
<property name="mappingResources">

46.
<list>

47.
<value>com/jjufriend/student/model/Student.hbm.xml</value></list>

48.
</property></bean>

49.

50.
<!-- 配置dao组件 -->

51.
<bean id="studentDao"

52.
class="com.jjufriend.student.dao.impl.StudentDaoHibernate">

53.
<!-- 依赖注入DAO组件所必需的SessionFactory引用 -->

54.
<property name="sessionFactory" ref="sessionFactory">

55.
</property>

56.
</bean>

57.
<!-- 配置业务逻辑组件 -->

58.
<bean id="mgr"

59.
class="com.jjufriend.student.service.impl.StudentManagerImpl">

60.
<property name="studentDao" ref="studentDao"></property>

61.
</bean>

62.

studentDao.java:

Java代码

package com.jjufriend.student.dao;

import java.util.List;

import com.jjufriend.student.model.Student;

public interface StudentDao {

Student get(Integer id);

10.

11.
Integer save(Student student);

12.

13.
void update(Student student);

14.

15.
void delete(Student student);

16.

17.
void delete(Integer id);

18.

19.
List<Student> findAll();

20.

21.
Student findStudentByNameAndPass(String username,String password);

22.

23.
Student findByName(String username);

24.

25.
}

StudentDaoHibernate.java:

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;

10.
import com.jjufriend.student.dao.StudentDao;

11.
import com.jjufriend.student.model.Student;

12.

13.
public class StudentDaoHibernate extends HibernateDaoSupport implements

14.
StudentDao,Serializable {

15.
private SessionFactory sessionFactory;

16.
HibernateTemplate ht = this.getHibernateTemplate() ;

17.

18.

19.

20.
public void delete(Student student) {

21.
// TODO Auto-generated method stub

22.
getHibernateTemplate().delete(student);

23.

24.
}

25.

26.
public void delete(Integer id) {

27.
// TODO Auto-generated method stub

28.
getHibernateTemplate().delete(get(id));

29.

30.
}

31.

32.
public List<Student> findAll() {

33.
// TODO Auto-generated method stub

34.
return (List<Student>)getHibernateTemplate().find("from Student");

35.

36.
}

37.

38.
public Student findByName(String username) {

39.

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

41.

42.
if(stu != null && stu.size() >= 1){

43.
return (Student)stu.get(0);

44.
}

45.

46.
return null;

47.
}

48.

49.
public Student findStudentByNameAndPass(String username, String password) {

50.
// TODO Auto-generated method stub

51.
List students = null;

52.
try{

53.

54.
// HibernateTemplate temple = this.getHibernateTemplate();

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

56.

57.
// 取出所有 students = temple.find("from student");

58.
students = ht.find("from student st where st.username = " + username + " and st.password = " + password);

59.

60.
}catch(Exception e){

61.
System.out.println("查找过程中出现异常..............");

62.
e.printStackTrace();

63.
}

64.
if(students != null && students.size() >= 1){

65.
return (Student)students.get(0);

66.
}

67.
return null;

68.
}

69.

70.
public Student get(Integer id) {

71.

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

73.

74.
}

75.

76.
public Integer save(Student student) {

77.
return (Integer)getHibernateTemplate().save(student);

78.
}

79.

80.
public void update(Student student) {

81.
// TODO Auto-generated method stub

82.
getHibernateTemplate().update(student);

83.

84.
}

85.

86.
}

StudentManager.java:

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;

10.

11.
boolean validateName(String username) throws Exception;

12.
}

StudentManagerImpl.java:

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() */

10.
private StudentDao studentDao = new StudentDaoHibernate() ;

11.

12.
// private ApplicationContext cxt =

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

14.
// studentDao =(StudentDaoHibernate)cxt.getBean("studentDao");

15.

16.
public void setStudentDao(StudentDao studentDao){

17.

18.
this.studentDao = studentDao ;

19.
}

20.

21.

22.
public int addStudent(Student student) throws Exception {

23.
// TODO Auto-generated method stub

24.
try{

25.
studentDao.save(student);

26.
return student.getId();

27.

28.
}catch(Exception e){

29.
e.printStackTrace();

30.
throw new Exception("新增用户时出现异常");

31.
}

32.

33.
}

34.

35.
public int loginValid(Student student) throws Exception {

36.
try{

37.

38.
System.out.println(studentDao);

39.
System.out.println("是否取到页面提交的数据:Name="+student.getUsername());

40.
Student stu = studentDao.findStudentByNameAndPass(student.getUsername(), student.getPassword());

41.
if(stu != null ){

42.
return stu.getId();

43.
}

44.

45.
}catch(Exception e){

46.
System.out.println("验证用户登录时出现异常");

47.
e.printStackTrace();

48.
}

49.

50.
// TODO Auto-generated method stub

51.
return -1;

52.
}

53.

54.
public boolean validateName(String username) throws Exception {

55.
// TODO Auto-generated method stub

56.
try{

57.
if (studentDao.findByName(username) != null){

58.
return true ;

59.
}

60.

61.

62.
}catch(Exception e){

63.
System.out.println("验证用户名是否用效时出错");

64.
e.printStackTrace();

65.

66.
}

67.
return false ;

68.

69.
}

70.

71.
}

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

下面这种方法是说不能直接new StudentDao对象,用下面这种方法取得,可以启动服务器老是不停地跳动,一直不停,直到报错。

Java代码

// private ApplicationContext cxt =

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

// private StudentDao studentDao =(StudentDaoHibernate)cxt.getBean("studentDao");

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

(顶格的System.out.println()语句均是测试用的语句)

问题补充:

谢谢大家的热心帮助!!

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

一楼的方法我尝试了,还是不行,

Java代码

private ApplicationContext cxt = this.getApplicationContext();

private StudentDao studentDao = (StudentDaoHibernate)cxt.getBean("studentDao");

其中那个this.getApplicationContext(); 方法根本不存在啊,无法取得配置文件。

之前类似的方法我也用过就是用

Java代码

private ApplicationContext cxt =

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

private StudentDao studentDao =(StudentDaoHibernate)cxt.getBean("studentDao");

取得,但是当启动服务器后,后台一直跑个不停,仿佛是个死循环似的。浏览器中通过http://localhost:8080访问都无效!

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

数据库方言也该过来了

Spring

2009年11月13日 12:49

天心皓月

15

0 0 0

添加评论

关注(0)

9个答案按时间排序按投票排序

00

采纳的答案

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

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。

以上观点仅代表个人意见,如果说的不对,请批评和指正。

2009年11月13日 13:45

fucktianya

4

0 0 1

1条评论

00

Java代码

public class StudentManagerImpl implements StudentManager {

private StudentDao studentDao ;

public static StudentManagerImpl smi;

public StudentManagerImpl()

{

smi = this;

System.out.println("我自动生成了");

}

10.

11.
public void setStudentDao(StudentDao studentDao){

12.
System.out.println("我自动调用了set方法");

13.
this.studentDao = studentDao ;

14.
}

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("自动调用");

10.
ht = this.getHibernateTemplate();

11.
sdh = this;

12.
}

13.

14.

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

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

不要直接new

2009年11月13日 17:33

areha001

51

0 0 0

添加评论

00

Java代码

public class StudentManagerImpl implements StudentManager {

private StudentDao studentDao ;

/**

*这个方法是由 spring 自动调用的,只要定义了studentDao ,在类里放上

*getter/setter就不用管了

* <bean id="mgr"

* class="com.jjufriend.student.service.impl.StudentManagerImpl">

10.
* <property name="studentDao" ref="studentDao"></property>

11.
* </bean>

12.
* 这里的property -name -ref 会帮你做好

13.
*/

14.
public void setStudentDao(StudentDao studentDao){

15.

16.
this.studentDao = studentDao ;

17.
}

2009年11月13日 17:24

areha001

51

0 0 0

添加评论

00

楼主,两个建议:

1.仔细对照书籍,按照书上的例子做一遍。你的问题主要是SPRING相关的不熟悉,所以hibernate砍掉,直接spring加载普通的类。先把简单的配置成功,再把hibernate,struts加进来,一个一个来。

2.出现问题一定要看控制台的信息,错误在哪行,是什么错误。

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

ApplicationContext是什么?

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

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

按照书上的例子走一遍。

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

2009年11月13日 16:53

energykey

919

0 0 0

添加评论

00

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

2009年11月13日 16:02

satanest

137

0 0 0

添加评论

00

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

1楼2楼3楼说的都对~

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

2009年11月13日 15:57

energykey

919

0 0 0

添加评论

00



Java代码

org.hibernate.dialect.SQLServerDialect

看来也是可以的,整个运行都没问题,没出现楼主说的问题

2009年11月13日 14:25

myali88

3108

0 0 0

添加评论

00

Java代码

<property name="url" value="jdbc:mysql://localhost:3306/jjufriend">

为什么你数据库用的是MySQL,而sessionFactory里的方言设置是

Java代码

<prop key="hibernate.dialect">

org.hibernate.dialect.SQLServerDialect

</prop>

,用的是SQLServer的,这肯定不行吧?!

2009年11月13日 14:04

myali88

3108

0 0 0

添加评论

00

Java代码

private ApplicationContext cxt = this.getApplicationContext();

private StudentDao studentDao = (StudentDaoHibernate)cxt.getBean("studentDao");

studentDao 对象直接 new 的话里面是没有Hibernate上下文的。

只能取得在配置文件中自动生成的实例
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: