spring1.2整合hibernate3的事务配置

最近做ssh组合的练习,实现一个用户管理模块,具有用户登陆,注册,用户信息修改三个功能,用户登陆时一切正常,注册新用户时出现错误,现问题已经解决,特备忘分享给像我一样的新手。

UserDao

package com.javasky.photo.dao;

import java.util.List;

import com.javasky.photo.model.User;

public interface UserDao {
	//根据主键查找用户
	public User findById(String id);
	//根据用户名查找
	public User getUserByUserName(String username);
	//保存用户
	public void saveUser(User user);
	//删除用户
	public void deleteUser(User user);
}

 

UserDaoHibernate

package com.javasky.photo.dao.hibernate;

import java.util.List;

import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import com.javasky.photo.dao.UserDao;
import com.javasky.photo.model.User;

public class UserDaoHibernate extends HibernateDaoSupport implements UserDao {

	/* (non-Javadoc)
	 * @see com.hljxxg.photoprint.dao.UserDao#deleteUser(com.hljxxg.photoprint.model.User)
	 */
	public void deleteUser(User user) {
		this.getHibernateTemplate().delete(user);
	}

	public User findById(String id) {
		return (User)this.getHibernateTemplate().get(User.class, userid);
	}

	public void saveUser(User user) {
		this.getHibernateTemplate().saveOrUpdate(user);

	}

	public User getUserByUserName(String userName){
		List<User> list = this.getHibernateTemplate().findByNamedParam("from User user where user.username=:username", "username", userName);
		if(list.size()==0){
			return null;
		}
		return list.get(0);
	}	

}

 

 

UserService

package com.javasky.photo.service;

import java.util.List;

import com.javasky.photo.model.User;

public interface UserService {
	public User findById(String id);
	public void saveUser(User user);
	public void updateUser(User user);
	public void deleteUser(User user);
	public User getUserByUsername(String username);

}

 

 

UserServiceImpl

package com.javasky.photo.service.impl;

import java.util.List;

import com.javasky.photo.dao.UserDao;
import com.javasky.photo.model.User;
import com.javasky.photo.service.UserService;

/**
 * @author batllehawk
 * Create 2008-11-28
 * Version 1.0
 */
public class UserServiceImpl implements UserService {
	private UserDao userDao;
	
	
	/**
	 * @return the userDao
	 */
	public UserDao getUserDao() {
		return userDao;
	}

	/**
	 * @param userDao the userDao to set
	 */
	public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	}

	public void deleteUser(User user) {
		this.getUserDao().deleteUser(user);
	}

	public User findById(String userid) {
		return this.getUserDao().findById(userid);
	}

	public void saveUser(User user) {
		this.getUserDao().saveUser(user);
	}

	public void updateUser(User user) {
		this.getUserDao().saveUser(user);
	}

	public User getUserByUsername(String username) {
		return this.getUserDao().getUserByUserName(username);
	}
	

}

 

spring的配置文件如下

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans.xsd
      default-autowire="byName">
<!-- 数据源配置dbcp 略 -->
<!-- sessionFactory配置 略-->
<!-- hibernate事务配置 略-->
    <!-- 事务代理父类 -->
    <bean id="baseTransactionProxy"
        class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
        abstract="true">
        <property name="transactionManager">
            <ref bean="transactionManager" />
        </property>
       
        <property name="transactionAttributes">
            <props>
                <prop key="save*" >PROPAGATION_REQUIRED</prop>
                <prop key="update*" >PROPAGATION_REQUIRED</prop>
                <prop key="delete*" >PROPAGATION_REQUIRED</prop>
                <prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
            </props>
        </property>
       
        <property name="optimize">
            <value>true</value>
        </property>
    </bean>
    <!-- service -->
    <bean id="userService"  parent="baseTransactionProxy" >
        <property name="target" >
            <bean class="com.javasky.photo.service.impl.UserServiceImpl"></bean>
        </property>
    </bean>
    <!-- DAO -->   
    <bean id="userDao" class="com.javasky.photo.dao.hibernate.UserDaoHibernate">
        <property name="sessionFactory">
            <ref local="sessionFactory"/>
        </property>
    </bean>

</beans>

spring事务管理支持两种方式,一种编程式事务管理,一种声明式事务管理,我觉得如果采用第一种方式,那么当我们想取消事务的时候就比较麻烦,相比而言,修改配置文件简单些,这里我使用第二中方式,userServiecBean里红色部分表示我们给它加上事务管理 ,另外,<property name="transactionAttributes">的属性中,红色部分的key命名我们要和UserService里的方法保持一致 ,开始我的UserService注册用户的方法我命名为addUser,而配置文件中我这样设置

<prop key="save*">PROPAGATION_REQUIRED</prop>

  key以save开头,导致出现以下错误

org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.NEVER/MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.
	at org.springframework.orm.hibernate3.HibernateTemplate.checkWriteOperationAllowed(HibernateTemplate.java:1095)
	at org.springframework.orm.hibernate3.HibernateTemplate$16.doInHibernate(HibernateTemplate.java:688)
	at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:372)
	at org.springframework.orm.hibernate3.HibernateTemplate.saveOrUpdate(HibernateTemplate.java:686)
	at com.javasky.photo.dao.hibernate.UserDaoHibernate.saveUser(UserDaoHibernate.java:32)
	at com.javasky.photo.service.impl.UserServiceImpl.saveUser(UserServiceImpl.java:60)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:585)
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:304)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:172)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:139)
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:107)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:161)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
	at $Proxy1.saveUser(Unknown Source)
	at com.javasky.photo.action.UserAction.addUser(UserAction.java:44)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:585)
	at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:274)
	at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:194)
	at org.springframework.web.struts.DelegatingActionProxy.execute(DelegatingActionProxy.java:106)
	at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419)
	at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
	at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1192)
	at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:430)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
	at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:857)
	at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:565)
	at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1509)
	at java.lang.Thread.run(Thread.java:595)

 如有不妥或更好的办法,希望不吝指出,谢谢!

下一篇我将贴出spring2.0整合hibernate3的配置

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值