saveorupdate()调用时候 如果ID为空会实现save方法来保存
但是当我的ID不为空时候  为什么就是不调用更新语句来更新 郁闷了很久 找不到原因
帮忙分析下我的pojo一些代码 // Property accessors
@Id
@GeneratedValue(generator = "paymentableGenerator")    
@GenericGenerator(name = "paymentableGenerator", strategy = "identity") 
public Integer getId() {
return this.id;
}

public void setId(Integer id) {
this.id = id;
}

@OneToMany(mappedBy="user",fetch=FetchType.EAGER)
public Set<UserPermission> getUserPermissions() {
return userPermissions;
}

public void setUserPermissions(Set<UserPermission> userPermissions) {
this.userPermissions = userPermissions;
}

@OneToMany(mappedBy="user",fetch=FetchType.EAGER)
public Set<UserRole> getUserRoles() {
return this.userRoles;
}

public void setUserRoles(Set<UserRole> userRoles) {
this.userRoles = userRoles;
} 我的web.xml 和事物的一些配置<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
</filter-class> 
<init-param>  
           <param-name>flushMode</param-name>  
           <param-value>AUTO</param-value>  
       </init-param> 
       <init-param>  
           <param-name>singleSession</param-name>  
           <param-value>true</param-value>  
       </init-param>  
   </filter>  
   
 <filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping> <filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>/j_acegi_security_check</url-pattern>
</filter-mapping> <filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping> 
<!--applicationContext的配置-->
 <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">    
<property name="sessionFactory">
<ref local="sessionFactory"/>
</property>    
   </bean> 
 
 <bean id="baseTransaction" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" 
           abstract="true"> 
           
         <property name="transactionManager" ref="transactionManager"/> 
         <property name="proxyTargetClass" value="true"/> 
         <property name="transactionAttributes"> 
             <props> 
                 <prop key="load*">PROPAGATION_REQUIRED,readOnly</prop> 
                  <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
                 <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
                 <prop key="save*">PROPAGATION_REQUIRED</prop> 
                 <prop key="add*">PROPAGATION_REQUIRED</prop> 
                 <prop key="update*">PROPAGATION_REQUIRED</prop> 
                 <prop key="remove*">PROPAGATION_REQUIRED</prop> 
                 <prop key="*">PROPAGATION_REQUIRED</prop> 
             </props> 
         </property> 
     </bean>  后台测试用的代码public void save(Object o) {
System.out.println("xiaoxiao");
User user=(User) getHibernateTemplate().get(User.class, 55);
user.setName("xiaoxiao");
getHibernateTemplate().save(user);
System.out.println("------" + ((User)o).getId() + ((User)o).getPassword() +((User)o).getUsername());
getHibernateTemplate().save(o);
} 打印的结果xiaoxiao
Hibernate: select user0_.id as id7_4_, ..... from auth_user user0_ left outer join auth_userpermission userpermis1_ on user0_.id=userpermis1_.userid left outer join auth_permission permission2_ on userpermis1_.permissionid=permission2_.id left outer join auth_userrole userroles3_ on user0_.id=userroles3_.user_id left outer join auth_role role4_ on userroles3_.role_id=role4_.id where user0_.id=?
------63sds大时代
Hibernate: insert into auth_user (descn, name, password, status, username) values (?, ?, ?, ?, ?)getHibernateTemplate().save(user); 我怎么改成saveorUpdate(user)也不行 不会调用update方法 这是为什么啊 !

解决方案 »

  1.   

    用saveorUpdate(user)是可以的,
    但你要将user的id传递过来(从页面),然后后台ACTION会自动将这个ID注入到user中,然后才会判断是调用的save还是update
      

  2.   

    不是 easyUI   单是这句总有Id吧?
          User user=(User) getHibernateTemplate().get(User.class, 55);
            user.setName("xiaoxiao");
            getHibernateTemplate().saveorupdate(user);他也不打印update  不知道是什么配置有问题
      

  3.   

    我也碰到过 
    逼的没办法 就只用SAVE 和UPDATE了
      

  4.   

    由于对hiberntate annotation 不是很熟悉 想问下是不是这方面的原因还是 事物方面 read-only的问题之前在在调用save方法的时候会报read-only问题 后面网上说是 opensessionviewfilter的问题 就加了
           <init-param> 
               <param-name>flushMode</param-name>  
               <param-value>AUTO</param-value>  
           </init-param> 
    这段配置
      

  5.   

     @OneToMany(mappedBy="user",fetch=FetchType.EAGER)
     修改为延迟 配置级联关系 试试
      

  6.   

    貌似一样System.out.println("xiaoxiao22merger");
    System.out.println(getHibernateTemplate().getFlushMode());
    User user=(User) getHibernateTemplate().get(User.class, 55);
    user.setName("xiaoxiao");
    getHibernateTemplate().merge(user);
    System.out.println(((User)o).getId() + ((User)o).getPassword() +((User)o).getUsername());
    getHibernateTemplate().save(o); 结果xiaoxiao22merger
    1
    Hibernate: select user0_.id as id7_4_, user0_.descn as descn7_4_, user0_.name as name7_4_, user0_.password as password7_4_, user0_.status as status7_4_, user0_.username as username7_4_, userpermis1_.userid as userid6_, userpermis1_.id as id6_, userpermis1_.id as id8_0_, userpermis1_.permissionid as permissi2_8_0_, userpermis1_.userid as userid8_0_, permission2_.id as id2_1_, permission2_.descn as descn2_1_, permission2_.name as name2_1_, permission2_.operation as operation2_1_, permission2_.status as status2_1_, userroles3_.user_id as user3_7_, userroles3_.id as id7_, userroles3_.id as id9_2_, userroles3_.role_id as role2_9_2_, userroles3_.user_id as user3_9_2_, role4_.id as id5_3_, role4_.descn as descn5_3_, role4_.name as name5_3_ from auth_user user0_ left outer join auth_userpermission userpermis1_ on user0_.id=userpermis1_.userid left outer join auth_permission permission2_ on userpermis1_.permissionid=permission2_.id left outer join auth_userrole userroles3_ on user0_.id=userroles3_.user_id left outer join auth_role role4_ on userroles3_.role_id=role4_.id where user0_.id=?
    71d 的
    Hibernate: insert into auth_user (descn, name, password, status, username) values (?, ?, ?, ?, ?)
      

  7.   

    save()最终会调用saveorUpdate()
    而saveorUpdate()在你的id为NULL或者空的时候会insert一条记录,否则就是update。
    debug一下,看看你的id是多少。
    根据你的代码,user是update了,因为它是根据id(55)查询出来的,而object o就不一定了。
      

  8.   

    没有执行update语句  数据库数据也没更改
      

  9.   

    merge 调的就是saveOrupdate这个问题确实很诡异
    别人工程里的可以 我每次saveOrUpdate 都是 insert 无论是否有主键ID值
      

  10.   

    折腾了2天 找到了问题所在  但是没有什么解决方案
    问题出在 openSesssionviewFilter 上  我之前是<filter>
            <filter-name>hibernateFilter</filter-name>
            <filter-class>
                org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
            </filter-class> 
            <init-param>  
               <param-name>flushMode</param-name>  
               <param-value>AUTO</param-value>  
           </init-param> 
           <init-param>  
               <param-name>singleSession</param-name>  
               <param-value>true</param-value>  
           </init-param>  
       </filter>  
       
         <filter-mapping>
            <filter-name>hibernateFilter</filter-name>
            <url-pattern>*.action</url-pattern>
        </filter-mapping>    <filter-mapping>
            <filter-name>hibernateFilter</filter-name>
            <url-pattern>/j_acegi_security_check</url-pattern>
        </filter-mapping>    <filter-mapping>
            <filter-name>hibernateFilter</filter-name>
            <url-pattern>*.jsp</url-pattern>
        </filter-mapping> 这样配置的 这样配置不能update 和delete 但是可以insert
    于是我怀疑是        <init-param>  
               <param-name>flushMode</param-name>  
               <param-value>AUTO</param-value>  
           </init-param> 
           <init-param>  
               <param-name>singleSession</param-name>  
               <param-value>true</param-value>  
           </init-param>
     
    他的问题 我把这段删除后 在查找时候不报异常 save update delete的时候都报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' er from transaction definition.
    org.springframework.orm.hibernate3.HibernateTemplate.checkWriteOperationAllowed(HibernateTemplate.java:1186)
    org.springframework.orm.hibernate3.HibernateTemplate$14.doInHibernate(HibernateTemplate.java:718)
    org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:419)
    org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
    org.springframework.orm.hibernate3.HibernateTemplate.update(HibernateTemplate.java:716)
    org.springframework.orm.hibernate3.HibernateTemplate.update(HibernateTemplate.java:712)
    com.xiao.zblogsystem.security.action.UserAction.modify(UserAction.java:54)
    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)
    .....如下异常于是我就尝试着把opensessionviewfilter的web.xml的配置删除了去, 这时候我再运行就没问题
    svae update delete 都能运行  
    现在就不知道openSessionviewfilter 要怎么配置了  我用的是 ssh2  spring annotation 和 hibernate annotation 谁能给个配置参考下 谢谢了!