大家帮我看下这是配置问题帮我分析下原因谢谢了 public String saveModify(){
System.out.println("*******************" );
User menu=(User) userDao.getHibernateTemplate().get(User.class,3);
//userDao.getHibernateTemplate().getSessionFactory().getCurrentSession().close();
menu.setName("33333");
userDao.getHibernateTemplate().saveOrUpdate(menu);
System.out.println(menu.getName());
return SUCCESS;
}得到一个对象 修改后保存。
这是我的openSessionViewFilter的配置<!-- 配置OpenSessionInViewFilter,必须在struts2监听之前-->
<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>  这里面运行上面方法后 *******************
Hibernate: select user0_.id as id7_0_, user0_.descn as descn7_0_, user0_.name as name7_0_, user0_.password as password7_0_, user0_.status as status7_0_, user0_.username as username7_0_ from auth_user user0_ where user0_.id=?
33333只运行上面这结果 到下面就
userDao.getHibernateTemplate().saveOrUpdate(menu); 这句没运行 而我吧程序改为
public String saveModify(){
System.out.println("*******************" );
User menu=(User) userDao.getHibernateTemplate().get(User.class,3);
                   //此处关闭下 让menu成为游离对象来处理
userDao.getHibernateTemplate().getSessionFactory().getCurrentSession().close();
menu.setName("33333");
userDao.getHibernateTemplate().saveOrUpdate(menu);
System.out.println(menu.getName());
return SUCCESS;
}后台结果是*******************
Hibernate: select user0_.id as id7_0_, user0_.descn as descn7_0_, user0_.name as name7_0_, user0_.password as password7_0_, user0_.status as status7_0_, user0_.username as username7_0_ from auth_user user0_ where user0_.id=?
Hibernate: update auth_user set descn=?, name=?, password=?, status=?, username=? where id=?
33333
这就是我现在比较苦恼的问题 为什么非要关闭下当前session下才能进行更新
不关闭事物就不提交吗?
当然我去除openSessionViewFilter的配置 什么问题都没有 请帮忙分析下
在线等

解决方案 »

  1.   

    http://topic.csdn.net/u/20100920/10/7f2cf090-301d-4dee-aabe-5dc106d65374.html我之前的一贴
      

  2.   

     getHibertnateTemplate() 怎么写的 ?.
      

  3.   

    userDao 直接就成了 hibernateDaosupport
      

  4.   

    本来就是这样的,因为只有成为游离对象,调用saveOrUpdate(menu),才能执行Update操作。
    你有可以用SESSION.CLEAR()替代getCurrentSession().close(),但本质上都是使menu成为游离对象。
      

  5.   

    get过来的对象状态是Persistent状态.
    而Persistent状态的对象是无法直接savaOrUpdate的.
    必须经过close或者clear之后,变成Detached状态才可以savaOrUpdate.
    网上有张图,很形象.看一看就明白了
      

  6.   

    楼主的问题所在,是因为没有搞清楚Hibernate操作对象的三态问题
    1.持久态对象状态修改后,无须进行update或saveOrUpdate
    2.配置了OpenSessionInViewFilter过滤器之后,你在业务对象中操作的对象将始终处于持久态
    3.使用OpenSessionInViewFilter是一种懒人办法,后者说是一种新手的编码方法,对程序的性能影响很大,建议不要使用
      

  7.   

    谢谢了  昨天翻书也发现了是 持久态好像在saveorupdate的时候是没有用的 
    OpenSessionInViewFilter考虑下是该去除了
      

  8.   

    OpenSessionInViewFilter会延长你的Session生命周期,因此有可能会造成Hibernate一级缓存溢出,所以还是要谨慎使用。
      

  9.   

    刚刚在忙工作  现在有空试了下
    我把saveorupdate 改成save 也还是无效  这貌似是事物没有提交吧 public String saveModify(){
    System.out.println("*******************" );
    User menu=(User) userDao.getHibernateTemplate().get(User.class,3);
    // userDao.getHibernateTemplate().getSessionFactory().getCurrentSession().close();
    menu.setName("54545");
    // userDao.getHibernateTemplate().saveOrUpdate(menu);
    userDao.getHibernateTemplate().save(menu);
    System.out.println(menu.getName());
    return SUCCESS;
    }
    后台打印
    *******************
    Hibernate: select user0_.id as id7_0_, user0_.descn as descn7_0_, user0_.name as name7_0_, user0_.password as password7_0_, user0_.status as status7_0_, user0_.username as username7_0_ from auth_user user0_ where user0_.id=?
    54545
    menu既然是持久对象应该会执行update语句 
    这是不是没有事物的提交的原因 我事物的配置<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">    
    <property name="sessionFactory">
    <ref local="sessionFactory"/>
    </property>    
      </bean>    <tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
    <tx:method name="getUser" read-only="true" />
    <tx:method name="add*" propagation="REQUIRED"/>
    <tx:method name="*" propagation="REQUIRED"/>
    </tx:attributes>
    </tx:advice>
      

  10.   

    你应该看看ssh,推荐你去魔乐那个学校的网站上下个教学视频看,比你看文字学的快多了