最近做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的配置