想实现判断用户是否存在,如存在则更新信息,并返回更新的用户ID号
以下代码很奇怪,如果把判断用户和更新操作分开操作(仅保留一个操作)就没有任何问题
但连着操作(判断合法并更新)在update执行saveOrUpdate中就会发生错误(使用println检测到),
是哪儿出错了?//在UserServerImpl.java中
public int updateUserinfo(User us){
 try{
    String[] strKeyword = new String[]{us.getUsername()};
    if(userDao.findTableByKeyword(us,"u.username = ?",strKeyword)){
      userDao.update(us);
      return us.getId();
    }
    return -1;
  }
  catch (Exception ex){
  log.debug(ex.getMessage());
 }
}
//在UserDaoImpl.java中
public boolean findTableByKeyword(Object tabObj ,String tabCol,String[] strKeyword)
{
  boolean ifRight = false;
  List<Object> ul = (List<Object>)getHibernateTemplate().find("from "+tabObj.getClass().getName()+" u where "+tabCol,strKeyword);
  if (ul.size() == 1){ifRight = true;}
  return ifRight;
}public void update(Object obj)
{
  getHibernateTemplate().saveOrUpdate(obj);
} Hibernate数据库

解决方案 »

  1.   

    我以前好像也遇到这个问题。不是很清楚好像是srping事物代理问题,我在网上听别人说事务代理冲突了。说只能先执行完一个然后才能在执行另外一个 如果你分开就没有问题了。
      

  2.   

    这个得看你spring配置文件中的  advice和aop:pointcut怎么配的,
    是否配了声明式事物
    或者,如果你的advice有一个 <tx:method name="update*" readOnlye="true"/>也会报错
      

  3.   

    传us的值时有id,我System.out.println在服务台看到了
    关于AOP的配置信息是:
    <!-- 配置事务切面Bean,指定事务管理器 -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
    <!-- 用于配置详细的事务语义 -->
    <tx:attributes>
    <!-- 所有以'get'开头的方法是read-only的 -->
                <tx:method name="add*" propagation="REQUIRED" />
                <tx:method name="delete*" propagation="REQUIRED" />
                <tx:method name="modify*" propagation="REQUIRED" />
                <tx:method name="*" read-only="true" />
    <!-- 其他方法使用默认的事务设置 -->
    <tx:method name="*"/>
    </tx:attributes>
    </tx:advice>
    <aop:config>
    <!-- 配置一个切入点,匹配指定包下所有以Impl结尾的类执行的所有方法 -->
    <aop:pointcut id="Pcut" expression="execution(* net.cxmz.www.service.impl.*Impl.*(..))"/>
    <!-- 指定在Pcut切入点应用txAdvice事务切面 -->
    <aop:advisor advice-ref="txAdvice" pointcut-ref="Pcut"/>
    </aop:config>
    运行的错误信息是:
    type Exception reportmessage description The server encountered an internal error () that prevented it from fulfilling this request.exception net.abc.www.common.SysException:  net.abc.www.service.impl.UserManagerImpl.updateUserinfo(UserManagerImpl.java:127)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    java.lang.reflect.Method.invoke(Method.java:597)
    org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:307)
    org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182)
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)
    org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106)
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
    org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
    org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
    $Proxy10.updateUserinfo(Unknown Source)
    net.cxmz.www.action.UserAction.AdminUserModifySave(UserAction.java:101)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    java.lang.reflect.Method.invoke(Method.java:597)
    com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:440)
    com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:279)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:242)
    net.cxmz.www.common.OnlineFilter.intercept(OnlineFilter.java:16)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
    com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:163)
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
    com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:249)
    org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68)
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
    com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:122)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
    com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195)
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
    com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195)
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
    com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:148)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
    org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:93)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
    org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:235)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
    com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:89)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
    com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:128)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
    org.apache.struts2.interceptor.ProfilingActivationInterceptor.intercept(ProfilingActivationInterceptor.java:104)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
    org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:267)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
    com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:126)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
    com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:138)
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
    com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:148)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
    org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
    com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:128)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
    com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:176)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
    org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52)
    org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:468)
    org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:395)
    org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
    org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:96)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
    org.apache.struts2.dispatcher.ActionContextCleanUp.doFilter(ActionContextCleanUp.java:102)
      

  4.   

    咋办呢?
    我在事务配置中加入了一句
     <tx:method name="update*" propagation="REQUIRED" />
    也不管用啊
      

  5.   


    看你的错误信息是这样net.abc.www.service.impl.UserManagerImpl
    而你的execution配的是<aop:pointcut id="Pcut" expression="execution(* net.cxmz.www.service.impl.*Impl.*(..))"/>你改成<aop:pointcut id="Pcut" expression="execution(* net.abc.www.service..*.*(..))"/>
    这样试试
      

  6.   

    哦,我的包是
    业务层实现net.cxmz.www.service.impl.UserManagerImpl
    dao实现层net.cxmz.www.dao.impl.UserDaoImpl
    user模型net.cxmz.www.service.model.User
    我的struts.xml
    <package name="user" extends="struts-default" namespace="/">
    ......
    <action name="AdminUserModifySave" class="UserAction" method="AdminUserModifySave">
      <interceptor-ref name="myStack"/>
      <result name="success">/WEB-INF/success.jsp</result>
      <result name="input">/WEB-INF/errview.jsp</result>
    </action>
    ......
    </package>
    我的FORM表单信息
    <s:form action="AdminUserModifySave" method="post" namespace="/" >
    用户名:<s:textfield name="username" value="%{user.username}"/>&nbsp;
    密 码:<s:textfield name="password" value="%{user.password}"/>&nbsp;
    <s:hidden name="id" value="%{uid}"/>
    <s:submit value="修改"/>
    </s:form>
      

  7.   

    execution配置和业务层包配置统一
      

  8.   

    user模型net.cxmz.www.model.User
      

  9.   

    再看看你的错误  和spring配置文件
      

  10.   

    今晚终于找到错误点了,但不知道怎么修复错误
    错误主要信息如下:
    a different object
    with the same identifier value was already associated with the session
    详细信息如下:
    org.springframework.orm.hibernate3.HibernateSystemException: a different object
    with the same identifier value was already associated with the session: [net.cxm
    z.www.model.User#38]; nested exception is org.hibernate.NonUniqueObjectException
    : a different object with the same identifier value was already associated with
    the session: [net.cxmz.www.model.User#38]
            at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHiberna
    teAccessException(SessionFactoryUtils.java:676)
            at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernate
    AccessException(HibernateAccessor.java:412)
            at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(Hibern
    ateTemplate.java:424)
            at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativ
    eSession(HibernateTemplate.java:374)
            at org.springframework.orm.hibernate3.HibernateTemplate.saveOrUpdate(Hib
    ernateTemplate.java:748)
            at net.cxmz.www.dao.impl.UserDaoImpl.update(UserDaoImpl.java:47)
            at net.cxmz.www.service.impl.UserManagerImpl.updateUserinfo(UserManagerI
    mpl.java:119)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
    java:39)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
    sorImpl.java:25)
            at java.lang.reflect.Method.invoke(Method.java:597)
            at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflecti
    on(AopUtils.java:307)
            at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJo
    inpoint(ReflectiveMethodInvocation.java:182)
            at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(
    ReflectiveMethodInvocation.java:149)
            at org.springframework.transaction.interceptor.TransactionInterceptor.in
    voke(TransactionInterceptor.java:106)
            at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(
    ReflectiveMethodInvocation.java:171)
            at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invok
    e(ExposeInvocationInterceptor.java:89)
            at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(
    ReflectiveMethodInvocation.java:171)
            at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynami
    cAopProxy.java:204)
            at $Proxy0.updateUserinfo(Unknown Source)
            at net.cxmz.www.action.UserAction.AdminUserModifySave(UserAction.java:10
    1)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
    java:39)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
    sorImpl.java:25)
            at java.lang.reflect.Method.invoke(Method.java:597)
            at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultA
    ctionInvocation.java:440)
            at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(Defa
    ultActionInvocation.java:279)
            at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionI
    nvocation.java:242)
            at net.cxmz.www.common.OnlineFilter.intercept(OnlineFilter.java:16)
            at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionI
    nvocation.java:236)
            at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doInte
    rcept(DefaultWorkflowInterceptor.java:163)
            at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept
    (MethodFilterInterceptor.java:87)
            at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionI
    nvocation.java:236)
            at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(V
    alidationInterceptor.java:249)
            at org.apache.struts2.interceptor.validation.AnnotationValidationInterce
    ptor.doIntercept(AnnotationValidationInterceptor.java:68)
            at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept
    (MethodFilterInterceptor.java:87)
            at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionI
    nvocation.java:236)
            at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.interc
    ept(ConversionErrorInterceptor.java:122)
            at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionI
    nvocation.java:236)
            at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept
    (ParametersInterceptor.java:195)
            at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept
    (MethodFilterInterceptor.java:87)
            at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionI
    nvocation.java:236)
            at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept
    (ParametersInterceptor.java:195)
            at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept
    (MethodFilterInterceptor.java:87)
            at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionI
    nvocation.java:236)
            at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.inter
    cept(StaticParametersInterceptor.java:148)
            at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionI
    nvocation.java:236)
            at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(Checkbox
    Interceptor.java:93)
            at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionI
    nvocation.java:236)
            at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUp
    loadInterceptor.java:235)
            at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionI
    nvocation.java:236)
            at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(
    ModelDrivenInterceptor.java:89)
            at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionI
    nvocation.java:236)
            at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.inte
    rcept(ScopedModelDrivenInterceptor.java:128)
            at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionI
    nvocation.java:236)
            at org.apache.struts2.interceptor.ProfilingActivationInterceptor.interce
    pt(ProfilingActivationInterceptor.java:104)
            at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionI
    nvocation.java:236)
            at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.interce
    pt(DebuggingInterceptor.java:267)
            at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionI
    nvocation.java:236)
            at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(Cha
    iningInterceptor.java:126)
            at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionI
    nvocation.java:236)
            at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(Pr
    epareInterceptor.java:138)
            at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept
    (MethodFilterInterceptor.java:87)
            at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionI
    nvocation.java:236)
            at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInt
    erceptor.java:148)
            at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionI
    nvocation.java:236)
            at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(Ser
    vletConfigInterceptor.java:164)
            at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionI
    nvocation.java:236)
            at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasI
    nterceptor.java:128)
            at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionI
    nvocation.java:236)
            at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.inter
    cept(ExceptionMappingInterceptor.java:176)
            at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionI
    nvocation.java:236)
            at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.j
    ava:52)
            at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.jav
    a:468)
            at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatc
    her.java:395)
            at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Appl
    icationFilterChain.java:235)
            at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationF
    ilterChain.java:206)
            at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.do
    FilterInternal(OpenSessionInViewFilter.java:198)
            at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerR
    equestFilter.java:76)
            at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Appl
    icationFilterChain.java:235)
      

  11.   

    搞定,据说是Session的问题,在update前要clear掉当前Session,不过不是最好的解决方案