我没写提交代码,不过看资料说提交操作已经被Spring封装在了update()这个函数里了.

解决方案 »

  1.   

    "我没写提交代码,不过看资料说提交操作已经被Spring封装在了update()这个函数里了."怎么可能,你需要在spring的配置文件里面配置的
      

  2.   

    你执行的时候看看控制台的SQL语句,他有没执行啊?
    如果执行了,是执行update还是save啊。。如果是执行save那么你在update前最好set一个oid给他,不然他就变成save了。就不update了。最好把全部代码放上来,不然我不知道从何看起啊。
      

  3.   

    public ActionForward update_user_info(ActionMapping mapping,    ActionForm  form, HttpServletRequest request,HttpServletResponse response)throws Exception {
    DynaActionForm userForm=(DynaActionForm)form;
    User user=(User)userForm.get("user");
             mgr.updateUser(user);
    return mapping.findForward("passthrough2");
    }
    ----------------------------------------------------------------------------------
    它认为你的USER是个新对像,会重新分配OID,然后你又用了UPDATE,可以试用getHibernateTemplate().updateOrUpdate(user);.
      

  4.   

    对update()这个函数还是有点晕.我把代码粘上来,朋友们帮看看哪地方写的有问题.//user对象定义User.java
    package org.appfuse.model;
    public class User extends BaseObject{
    private String name;
    private String password;
    private String email;
    private String www;
    //为了便于观看,get和set函数被省略掉了
    }//对象与数据库映射User.hbm.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
    <hibernate-mapping>
    <class name="org.appfuse.model.User" table="t_user">
    <id name="name" column="c_name" unsaved-value="0">
    <generator class="assigned"/> //这个主键值希望通过输入来指定,而不希望系统自动生成,所以用了assigned
    </id>
    <property name="password" column="c_password" not-null="true"/>
    <property name="email" column="c_email" not-null="true"/>
    <property name="www"  column="c_www"/>
    </class>
    </hibernate-mapping>
    //数据库接口UserDAO.java
    package org.appfuse.dao;
    import org.appfuse.model.User;
    public interface UserDAO extends DAO{
    public User getUser(String userName);
    public void saveUser(User user);
    public void updateUser(User user);
    }//接口实现UserDAOHibernate.java
    package org.appfuse.dao.hibernate;
    import org.appfuse.dao.UserDAO;
    import org.springframework.orm.hibernate.support.HibernateDaoSupport;
    import org.appfuse.model.User;
    public class UserDAOHibernate extends HibernateDaoSupport implements UserDAO{
    public User getUser(String name)
    {
    return (User)getHibernateTemplate().get(User.class,name);
    }
    public void saveUser(User user)
    {
    getHibernateTemplate().save(user);
    }
    public void updateUser(User user)
    {
    getHibernateTemplate().update(user);
    }  
    }//事物对象接口UserManager.java
    package org.appfuse.service;
    import org.appfuse.model.User;
    public interface UserManager{
    public User getUser(String userName);
    public void saveUser(User user);
    public void updateUser(User user);
    }//事物对象接口的实现UserManagerImpl.java
    package org.appfuse.service.impl;
    import org.appfuse.service.UserManager;
    import org.appfuse.dao.UserDAO;
    import org.appfuse.model.User;
    public class UserManagerImpl implements UserManager{
    private UserDAO dao;
    public void setUserDAO(UserDAO dao)
      {this.dao=dao;}
    public User getUser(String name)
    {
    return dao.getUser(name);
    }
    public void saveUser(User user)
    {
    dao.saveUser(user);
    }
    public void updateUser(User user)
    {
    dao.updateUser(user);
    }

    }//Spring配置文件applicationContext.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
        "http://www.springframework.org/dtd/spring-beans.dtd"><beans>
        <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
            <property name="driverClassName"><value>org.hsqldb.jdbcDriver</value></property>
            <property name="url"><value>jdbc:hsqldb:db/appfuse</value></property>
            <property name="username"><value>sa</value></property>
            <property name="password"><value></value></property>
        </bean>    <!-- Hibernate SessionFactory -->
        <bean id="sessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
            <property name="dataSource"><ref local="dataSource"/></property>
            <property name="mappingResources">
                <list>
                    <!-- Add list of .hbm.xml files here -->
                    <value>org/appfuse/model/User.hbm.xml</value>
                </list>
            </property>
            <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">net.sf.hibernate.dialect.HSQLDialect</prop>
                <prop key="hibernate.hbm2ddl.auto">create</prop>
            </props>
            </property>
        </bean>    <!-- Transaction manager for a single Hibernate SessionFactory (alternative to JTA) -->
        <bean id="transactionManager" class="org.springframework.orm.hibernate.HibernateTransactionManager">
            <property name="sessionFactory"><ref local="sessionFactory"/></property>
        </bean>
        
        <!-- Add DAOs here -->
        <bean id="userDAO" class="org.appfuse.dao.hibernate.UserDAOHibernate">
         <property name="sessionFactory">
         <ref local="sessionFactory"/>
         </property>
        </bean>
        
        <!-- Add Managers here -->
        <bean id="userManagerTarget" class="org.appfuse.service.impl.UserManagerImpl">
         <property name="userDAO">
         <ref local="userDAO"/>
         </property>
        </bean>
        <bean id="userManager" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
         <property name="transactionManager">
         <ref local="transactionManager"/>
         </property>
         <property name="target">
         <ref local="userManagerTarget"/>
         </property>
         <property name="transactionAttributes">
         <props>
         <prop key="save*">PROPAGATION_REQUIRED</prop>
    <prop key="remove*">PROPAGATION_REQUIRED</prop>
    <prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
         </props>
         </property>
        </bean>
       
    </beans>
      

  5.   

    //事物处理控制中心UserAction.jsp
    package org.appfuse.web;
    import org.apache.struts.actions.DispatchAction;
    import org.appfuse.service.UserManager;
    import org.apache.struts.action.ActionForward;
    import org.apache.struts.action.ActionMapping;
    import org.apache.struts.action.ActionForm;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import org.apache.struts.action.ActionMessages;
    import org.apache.struts.action.ActionMessage;
    import org.appfuse.model.User;
    import javax.servlet.http.HttpSession;
    import org.apache.struts.action.DynaActionForm;
    public class UserAction extends DispatchAction{
    private UserManager mgr=null;
    public void setUserManager(UserManager userManager)
    {this.mgr=userManager;}

    //为了便于观看,其他事物处理函数没写,仅留这个更新操作函数
    public ActionForward update_user_info(ActionMapping mapping, ActionForm form,
                HttpServletRequest request,
                HttpServletResponse response)throws Exception {
    DynaActionForm userForm=(DynaActionForm)form;
    User user=(User)userForm.get("user");
         mgr.updateUser(user);
    return mapping.findForward("passthrough2");
    }
    }//struts配置文件struts-config.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE struts-config PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"
        "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
    <struts-config>
        <!-- ======================================== Form Bean Definitions -->
        <form-beans>
            <form-bean
                name="userForm" type="org.apache.struts.validator.DynaValidatorForm">
                <form-property name="user" type="org.appfuse.model.User"/>
            </form-bean>
        </form-beans>
        <!-- =================================== Global Forward Definitions -->
        <global-forwards>
        </global-forwards>
        <!-- =================================== Action Mapping Definitions -->
        <action-mappings>
         <action path="/user"
    type="org.springframework.web.struts.DelegatingActionProxy" name="userForm"
    scope="session" parameter="method" >
    <forward name="index" path="/myindex.jsp"/>
    <forward name="register" path="/register.jsp"/>
    <forward name="register_confirm" path="/register_confirm.jsp"></forward>
    <forward name="passthrough1" path="/passthrough.jsp?showword=zhuce"></forward>
    <forward name="revise" path="/revise.jsp"></forward>
    <forward name="passthrough2" path="/passthrough.jsp?showword=xiugai"></forward>
    </action>
        </action-mappings>
        <!-- ================================ Message Resources Definitions -->
        <message-resources parameter="messages"/>
        <!-- ======================================= Plug Ins Configuration -->
        <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
         <set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml, /WEB-INF/action-servlet.xml"/>
        </plug-in>
        <plug-in className="org.apache.struts.validator.ValidatorPlugIn">
            <set-property
                property="pathnames" value="/WEB-INF/validator-rules.xml,
                                            /WEB-INF/validation.xml"/>
        </plug-in>
    </struts-config>//另一struts配置文件action-servlet.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
        "http://www.springframework.org/dtd/spring-beans.dtd">
    <beans>
        <!-- Define Struts Actions here -->
        <bean name="/user" class="org.appfuse.web.UserAction" singleton="false">
    <property name="userManager">
    <ref bean="userManager"/>
    </property>
    </bean>
    </beans>//修改注册信息的页面revise.jsp
    <%@page language="java" pageEncoding="UTF-8"%>
    <%@page contentType="text/html;charset=UTF-8"%>
    <%@include file="/taglibs.jsp"%>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    <title>用户修改注册信息</title>
    <link rel=stylesheet href="style.css" type="text/css">
    </head>
    <body>
    <%@include file="top.htm"%>
    <%@include file="/messages.jsp"%>
    <center>
    <p>请修改您的个人信息(标注'*'的内容必须填写)</p>
    <html:form action="/user" focus="user.password" 
    onsubmit="return validateUserForm(this)">
    <input type="hidden" name="method" value="update_user_info">
    <table width='70%' border='1' height='160'>
    <tr>
    <td align='left' colspan='2'>登录名:
    <html:text property="user.name"/>
    </td>
    </tr>
    <tr>
    <td align='left'>密码:<html:password property="user.password"/></td>
    <td align='left'>确认:<input type="password" name="re_password"
    value=<bean:define id="user" name="userForm" property="user"/>
      <bean:write name="user" property="password"/>>
    </td>
    </tr>
    <tr>
    <td align='left'>Email:<html:text property="user.email"/></td>
    <td align='left'>主页:<html:text property="user.www"/></td>
    </tr>
    <tr>
    <td colspan='2' align='center'>
    <html:submit styleClass="button">确认修改</html:submit>
    </td>
    </tr>
    </table>
    </html:form>
    <html:javascript formName="userForm"/>
    </center>
    <%@include file="bottom.htm"%>
    </body>
    </html>
      

  6.   

    这是程序运行的日志DEBUG - TransactionInterceptor.invoke(168) | Getting transaction for method 'updateUser' in class [org.appfuse.service.UserManager]
    DEBUG - AbstractPlatformTransactionManager.getTransaction(163) | Using transaction object [org.springframework.orm.hibernate.HibernateTransactionObject@13f903b]
    DEBUG - AbstractPlatformTransactionManager.getTransaction(214) | Creating new transaction
    DEBUG - SessionFactoryUtils.getSession(183) | Opening Hibernate session
    DEBUG - SessionImpl.<init>(555) | opened session
    DEBUG - HibernateTransactionManager.doBegin(271) | Opened new session [net.sf.hibernate.impl.SessionImpl@1784911] for Hibernate transaction
    DEBUG - HibernateTransactionManager.doBegin(280) | Beginning Hibernate transaction on session [net.sf.hibernate.impl.SessionImpl@1784911]
    INFO - DriverManagerDataSource.getConnectionFromDriverManager(152) | Creating new JDBC connection to [jdbc:hsqldb:db/appfuse]
    DEBUG - HibernateTransactionManager.doBegin(292) | Setting JDBC connection [org.hsqldb.jdbcConnection@1ed957d] read-only
    DEBUG - JDBCTransaction.begin(37) | begin
    DEBUG - JDBCTransaction.begin(41) | current autocommit status:true
    DEBUG - JDBCTransaction.begin(43) | disabling autocommit
    DEBUG - TransactionSynchronizationManager.bindResource(141) | Bound value [org.springframework.orm.hibernate.SessionHolder@f16568] for key [net.sf.hibernate.impl.SessionFactoryImpl@ec32de] to thread [http-8080-Processor25]
    DEBUG - TransactionSynchronizationManager.bindResource(141) | Bound value [org.springframework.jdbc.datasource.ConnectionHolder@38c8c5] for key [org.springframework.jdbc.datasource.DriverManagerDataSource@1f5d699] to thread [http-8080-Processor25]
    DEBUG - TransactionSynchronizationManager.initSynchronization(192) | Initializing transaction synchronization
    DEBUG - TransactionSynchronizationManager.getResource(117) | Retrieved value [org.springframework.orm.hibernate.SessionHolder@f16568] for key [net.sf.hibernate.impl.SessionFactoryImpl@ec32de] bound to thread [http-8080-Processor25]
    DEBUG - SessionImpl.doUpdateMutable(1439) | updating [org.appfuse.model.User#sss]
    DEBUG - TransactionInterceptor.invoke(208) | Invoking commit for transaction on method 'updateUser' in class [org.appfuse.service.UserManager]
    DEBUG - AbstractPlatformTransactionManager.triggerBeforeCommit(432) | Triggering beforeCommit synchronization
    DEBUG - AbstractPlatformTransactionManager.triggerBeforeCompletion(447) | Triggering beforeCompletion synchronization
    INFO - AbstractPlatformTransactionManager.commit(315) | Initiating transaction commit
    DEBUG - HibernateTransactionManager.doCommit(382) | Committing Hibernate transaction on session [net.sf.hibernate.impl.SessionImpl@1784911]
    DEBUG - JDBCTransaction.commit(59) | commit
    DEBUG - SessionImpl.afterTransactionCompletion(585) | transaction completion
    DEBUG - JDBCTransaction.toggleAutoCommit(103) | re-enabling autocommit
    DEBUG - AbstractPlatformTransactionManager.triggerAfterCompletion(477) | Triggering afterCompletion synchronization
    DEBUG - TransactionSynchronizationManager.clearSynchronization(232) | Clearing transaction synchronization
    DEBUG - TransactionSynchronizationManager.unbindResource(163) | Removed value [org.springframework.jdbc.datasource.ConnectionHolder@38c8c5] for key [org.springframework.jdbc.datasource.DriverManagerDataSource@1f5d699] from thread [http-8080-Processor25]
    DEBUG - TransactionSynchronizationManager.unbindResource(163) | Removed value [org.springframework.orm.hibernate.SessionHolder@f16568] for key [net.sf.hibernate.impl.SessionFactoryImpl@ec32de] from thread [http-8080-Processor25]
    DEBUG - HibernateTransactionManager.doCleanupAfterCompletion(461) | Resetting read-only flag of connection [org.hsqldb.jdbcConnection@1ed957d]
    DEBUG - HibernateTransactionManager.doCleanupAfterCompletion(475) | Closing Hibernate session [net.sf.hibernate.impl.SessionImpl@1784911] after transaction
    DEBUG - SessionFactoryUtils.closeSessionIfNecessary(348) | Closing Hibernate session
    DEBUG - SessionImpl.close(573) | closing session
    DEBUG - SessionImpl.disconnect(3332) | disconnecting session
    DEBUG - SessionImpl.afterTransactionCompletion(585) | transaction completion