Spring Hibernate整合问题,求大神帮忙~~~~~~~

Old-Summer 2015-05-07 10:29:15
SSH整合,全部采用注解配置。

Struts已经整合好了,将Hibernate整合到Spring时,出现了空指针。
2015-05-07 10:10:58,495 DEBUG (com.opensymphony.xwork2.ognl.accessor.XWorkMethodAccessor:84) - Error calling method through OGNL: object: [com.gmc.action.user.LoginAction@433a316a] method: [execute] args: [[]]
java.lang.NullPointerException
at com.gmc.dao.BaseDaoHibernate4.get(BaseDaoHibernate4.java:27)
at com.gmc.service.UserServiceImpl.checkUser(UserServiceImpl.java:37)
at com.gmc.action.user.LoginAction.execute(LoginAction.java:28)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at ognl.OgnlRuntime.invokeMethod(OgnlRuntime.java:870)
at ognl.OgnlRuntime.callAppropriateMethod(OgnlRuntime.java:1293)
at ognl.ObjectMethodAccessor.callMethod(ObjectMethodAccessor.java:68)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)
2015-05-07 10:10:58,497 DEBUG (com.opensymphony.xwork2.DefaultActionInvocation:76) - No result returned for action com.gmc.action.user.LoginAction at null
2015-05-07 10:10:58,498 DEBUG (com.opensymphony.xwork2.interceptor.I18nInterceptor:80) - after Locale=zh_CN
2015-05-07 10:10:58,498 DEBUG (com.opensymphony.xwork2.interceptor.I18nInterceptor:76) - intercept }


文件目录:

具体代码如下:
applicationContext.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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.1.xsd">





<!-- 定义数据源Bean,使用C3P0数据源实现,并注入数据源的必要信息 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close"
p:driverClass="com.mysql.jdbc.Driver"
p:jdbcUrl="jdbc:mysql://127.0.0.1:3306/gmc"
p:user="root"
p:password="root"
p:maxPoolSize="40"
p:minPoolSize="2"
p:initialPoolSize="2"
p:maxIdleTime="30"/>

<!-- 定义Hibernate的SessionFactory,SessionFactory需要依赖数据源,注入dataSource -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" p:dataSource-ref="dataSource">
<!-- annotatedClasses用来列出全部持久化类 -->
<property name="annotatedClasses">
<list>
<!-- 以下用来列出所有的PO类-->
<value>com.gmc.entity.User</value>
<value>com.gmc.entity.Article</value>
</list>
</property>
<!-- 定义Hibernate SessionFactory的属性 -->
<property name="hibernateProperties">
<props>
<!-- 指定Hibernate的连接方言 -->
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQL5InnoDBDialect</prop>
<!--是否根据Hiberante映射创建数据表 -->
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
</props>
</property>
</bean>


<context:component-scan base-package="com.gmc.*"/>
<!-- <context:component-scan base-package="com.gmc.service"/>
<context:component-scan base-package="com.gmc.dao"/>
<context:component-scan base-package="com.gmc.entity"/>
<context:component-scan base-package="com.gmc.action.*"/> -->
</beans>

LoginAction:
package com.gmc.action.user;

import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

import com.gmc.service.UserService;
import com.gmc.service.UserServiceImpl;
import com.opensymphony.xwork2.ActionSupport;



@Namespace("/user")
@Controller
public class LoginAction extends ActionSupport{
private UserServiceImpl userServiceImpl;

@Autowired
private void setUserService(UserServiceImpl userServiceImpl){
this.userServiceImpl = userServiceImpl;
}

public String execute() {


System.out.println("LoginAction");
if (userServiceImpl.checkUser("ccc", "aaa")) {//
System.out.println("##############");
}else {
System.out.println("@@@@@@@@@@@@@@@");
}


return SUCCESS;
}
}



UserServiceInpl:
package com.gmc.service;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.gmc.dao.UserDao;
import com.gmc.dao.UserDaoHibernate4;
import com.gmc.entity.User;

@Service
public class UserServiceImpl implements UserService {

private UserDaoHibernate4 userDaoHibernate4;

@Autowired
public void serUserDao(UserDaoHibernate4 userDaoHibernate4) {
this.userDaoHibernate4 = userDaoHibernate4;
}

@Override
public boolean checkUser(String user_name, String user_pass) {

User user = userDaoHibernate4.get(User.class, 1);
System.out.println(user.getUserName());


System.out.println("22222222222222222222");


return true;
}

}


...全文
277 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Old-Summer 2015-05-09
  • 打赏
  • 举报
回复
最后发现是因为是用hibernate4,不支持getCurrentSession(),全部替换为openSession()就好了
z_yes163 2015-05-08
  • 打赏
  • 举报
回复
   @Repository public class BaseDaoHibernate4<T> extends HibernateDao implements BaseDao<T> { } 然后下面的什么sessonFactory 不用写, spring帮你注入了 * 通过主键查询数据 */ public T get(final Pk id) { return (T) this.getSession().get(this.entityClass, id); } 直接这样 就可以 一定要继承hibernateDao
andre374 2015-05-07
  • 打赏
  • 举报
回复
这种事情记得看错误信息,上面写了具体是哪个类哪个方法哪一行,所以实际上你没把关键类贴出来。
Old-Summer 2015-05-07
  • 打赏
  • 举报
回复
引用 7 楼 u013762572 的回复:
首先 你的 return (T)getSessionFactory().getCurrentSession().get(entityClazz , id); 是要在在事物中才能使用getCurrentSession()的,所以你要加上事物配置, 但是你使用的是hibernate4.0 所以得改成。。。。 <!-- 声明式事物管理 --> <bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"/> </bean> <!-- 注解驱动 --> <tx:annotation-driven transaction-manager="txManager"/>
已经引用了 但还是原来的空指针错误 请问需要加@Transactional 什么的么
microhex 2015-05-07
  • 打赏
  • 举报
回复
首先 你的 return (T)getSessionFactory().getCurrentSession().get(entityClazz , id); 是要在在事物中才能使用getCurrentSession()的,所以你要加上事物配置, 但是你使用的是hibernate4.0 所以得改成。。。。 <!-- 声明式事物管理 --> <bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"/> </bean> <!-- 注解驱动 --> <tx:annotation-driven transaction-manager="txManager"/>
Old-Summer 2015-05-07
  • 打赏
  • 举报
回复
引用 4 楼 z_yes163 的回复:
<!-- 事务管理器配置,单数据源事务 --> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <!-- 使用annotation定义事务 --> <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" /> 加上这两个 然后你的dao基类的代码呢 错误在这里 BaseDaoHibernate4.java:27 27行 贴出来看看
加了之后启动出了问题。。。 看不懂 大神求解释一下
2015-05-07 21:06:29,177  INFO (org.hibernate.engine.jdbc.internal.LobCreatorBuilder:123) - HHH000424: Disabling contextual LOB creation as createClob() method threw error : java.lang.reflect.InvocationTargetException
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager' defined in class path resource [applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.NoClassDefFoundError: org/hibernate/engine/SessionFactoryImplementor
Caused by: java.lang.NoClassDefFoundError: org/hibernate/engine/SessionFactoryImplementor
	at org.springframework.orm.hibernate3.SessionFactoryUtils.getDataSource(SessionFactoryUtils.java:129)
	at org.springframework.orm.hibernate3.HibernateTransactionManager.afterPropertiesSet(HibernateTransactionManager.java:414)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1633)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1570)
	... 21 more
Caused by: java.lang.ClassNotFoundException: org.hibernate.engine.SessionFactoryImplementor
	at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1305)
	at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1157)
	... 25 more
2015-05-07 21:06:29,818 ERROR (org.springframework.web.context.ContextLoader:331) - Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager' defined in class path resource [applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.NoClassDefFoundError: org/hibernate/engine/SessionFactoryImplementor
Caused by: java.lang.NoClassDefFoundError: org/hibernate/engine/SessionFactoryImplementor
	at org.springframework.orm.hibernate3.SessionFactoryUtils.getDataSource(SessionFactoryUtils.java:129)
	at org.springframework.orm.hibernate3.HibernateTransactionManager.afterPropertiesSet(HibernateTransactionManager.java:414)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1633)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1570)
	... 21 more
Caused by: java.lang.ClassNotFoundException: org.hibernate.engine.SessionFactoryImplementor
	at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1305)
	at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1157)
	... 25 more
Old-Summer 2015-05-07
  • 打赏
  • 举报
回复
package com.gmc.dao;

import org.hibernate.*;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.io.Serializable;
 
@Repository
public class BaseDaoHibernate4<T> implements BaseDao<T>
{
	// DAO组件进行持久化操作底层依赖的SessionFactory组件
	private SessionFactory sessionFactory;
	// 依赖注入SessionFactory所需的setter方法
	public void setSessionFactory(SessionFactory sessionFactory)
	{
		this.sessionFactory = sessionFactory;
	}
	public SessionFactory getSessionFactory()
	{
		return this.sessionFactory;
	}
	// 根据ID加载实体
	@SuppressWarnings("unchecked")
	public T get(Class<T> entityClazz , Serializable id)
	{
		return (T)getSessionFactory().getCurrentSession()
			.get(entityClazz , id);
	}
	// 保存实体
	public Serializable save(T entity)
	{
		return getSessionFactory().getCurrentSession()
			.save(entity);
	}
	// 更新实体
	public void update(T entity)
	{
		getSessionFactory().getCurrentSession().saveOrUpdate(entity);
	}
	// 删除实体
	public void delete(T entity)
	{
		getSessionFactory().getCurrentSession().delete(entity);
	}
	// 根据ID删除实体
	public void delete(Class<T> entityClazz , Serializable id)
	{
		getSessionFactory().getCurrentSession()
			.createQuery("delete " + entityClazz.getSimpleName()
				+ " en where en.id = ?0")
			.setParameter("0" , id)
			.executeUpdate();
	}
	// 获取所有实体
	public List<T> findAll(Class<T> entityClazz)
	{
		return find("select en from "
			+ entityClazz.getSimpleName() + " en");
	}
	// 获取实体总数
	
	public long findCount(Class<T> entityClazz)
	{
		List<?> l = find("select count(*) from "
			+ entityClazz.getSimpleName());
		// 返回查询得到的实体总数
		if (l != null && l.size() == 1 )
		{
			return (Long)l.get(0);
		}
		return 0;
	}

	// 根据HQL语句查询实体
	@SuppressWarnings("unchecked")
	protected List<T> find(String hql)
	{
		return (List<T>)getSessionFactory().getCurrentSession()
			.createQuery(hql)
			.list();
	}
	// 根据带占位符参数HQL语句查询实体
	@SuppressWarnings("unchecked")
	protected List<T> find(String hql , Object... params)
	{
		// 创建查询
		Query query = getSessionFactory().getCurrentSession()
			.createQuery(hql);
		// 为包含占位符的HQL语句设置参数
		for(int i = 0 , len = params.length ; i < len ; i++)
		{
			query.setParameter(i + "" , params[i]);
		}
		return (List<T>)query.list();
	}
	/**
	 * 使用hql 语句进行分页查询操作
	 * @param hql 需要查询的hql语句
	 * @param pageNo 查询第pageNo页的记录
	 * @param pageSize 每页需要显示的记录数
	 * @return 当前页的所有记录
	 */
	@SuppressWarnings("unchecked")
	protected List<T> findByPage(String hql,
		 int pageNo, int pageSize)
	{
		// 创建查询
		return getSessionFactory().getCurrentSession()
			.createQuery(hql)
			// 执行分页
			.setFirstResult((pageNo - 1) * pageSize)
			.setMaxResults(pageSize)
			.list();
	}
	/**
	 * 使用hql 语句进行分页查询操作
	 * @param hql 需要查询的hql语句
	 * @param params 如果hql带占位符参数,params用于传入占位符参数
	 * @param pageNo 查询第pageNo页的记录
	 * @param pageSize 每页需要显示的记录数
	 * @return 当前页的所有记录
	 */
	@SuppressWarnings("unchecked")
	protected List<T> findByPage(String hql , int pageNo, int pageSize
		, Object... params)
	{
		// 创建查询
		Query query = getSessionFactory().getCurrentSession()
			.createQuery(hql);
		// 为包含占位符的HQL语句设置参数
		for(int i = 0 , len = params.length ; i < len ; i++)
		{
			query.setParameter(i + "" , params[i]);
		}
		// 执行分页,并返回查询结果
		return query.setFirstResult((pageNo - 1) * pageSize)
			.setMaxResults(pageSize)
			.list();
	}
}
z_yes163 2015-05-07
  • 打赏
  • 举报
回复
<!-- 事务管理器配置,单数据源事务 --> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <!-- 使用annotation定义事务 --> <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" /> 加上这两个 然后你的dao基类的代码呢 错误在这里 BaseDaoHibernate4.java:27 27行 贴出来看看
西部落酋长 2015-05-07
  • 打赏
  • 举报
回复
目测在dao层检测到dao出的问题看配置吧
yxfacw 2015-05-07
  • 打赏
  • 举报
回复
空指针异常 目测是userService异常
仿淘宝的B2C商城项目,后台功能基本完善,前端展示简单,近期上线,前端大神参与,立志完善成商业版,有意参与者请联系我:nietaooldman@126.com 仿淘宝的B2C商城项目 一、项目介绍: 本项目使用SSH框架和MySQL数据库。实现SpringHibernate和Struts的整合。目前实现功能:(1)前台功能:用户注册、商品展示、购物车功能(商品进行添加、删除、修改、查看操作),订单提交。(2)后台功能:商品增删改查和订单管理。(3)商品搜索(搜索内容进行分词,提取关键字,模糊查询)。(4)QQ在线咨询功能。本项目基本实现完整的B2C网站的功能。 二、项目部署: 本项目使用Eclipse_EE + Tomcat7.0+ MySql5.6的开发环境。 1、安装 Eclipse_EE、Tomcat、MySql软件。 2、MySql数据库中创建shop数据库。 (1)CREATE DATABASE shop CHARACTER SET utf8 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT COLLATE utf8_general_ci ; (2)本项目中sql/shop.sql,执行shop.sql,SQL语句创建各种表单,和默认管理员用户 ,默认普通用户。管理员用户名:admin,密码:123.普通用户的用户名:throne212,密码 123. 3、本网站源码导入Eclipse中,网站就可以运行。 ../Shop/manager/index.jsp为后台管理界面。 三、网站近期上线 本人是电子科大的研究生,擅长网站后台开发,后台功能基本完善,前台页面展示简单,如果你感兴趣,就可以参与进来,立志完善成商业版,有意参与者请和我联系: 邮箱:nietaooldman@126.com qq群:330242176

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧