大家帮我看下这是配置问题帮我分析下原因谢谢了 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的配置 什么问题都没有 请帮忙分析下
在线等
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的配置 什么问题都没有 请帮忙分析下
在线等
你有可以用SESSION.CLEAR()替代getCurrentSession().close(),但本质上都是使menu成为游离对象。
而Persistent状态的对象是无法直接savaOrUpdate的.
必须经过close或者clear之后,变成Detached状态才可以savaOrUpdate.
网上有张图,很形象.看一看就明白了
1.持久态对象状态修改后,无须进行update或saveOrUpdate
2.配置了OpenSessionInViewFilter过滤器之后,你在业务对象中操作的对象将始终处于持久态
3.使用OpenSessionInViewFilter是一种懒人办法,后者说是一种新手的编码方法,对程序的性能影响很大,建议不要使用
OpenSessionInViewFilter考虑下是该去除了
我把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>