ssh框架 如何在ACTION中实现事务管理,出错ROLLBACK
private ActionForward update(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response){SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
ActionErrors errors = new ActionErrors();
ApplicationContext context = getWebApplicationContext();
IPlancloseService service = (IPlancloseService)context.getBean("PlancloseService");
zzjhfcForm zzForm = (zzjhfcForm) form;
String[] m_mark = zzForm.getRw_mark_yc();
String[] m_jhyf = zzForm.getYearmonth();
String[] m_update = zzForm.getUpdate_mark() ;
String hsql = "{call UP_ZZJHBAK_ORA(?)}";
for(int i=0;i<m_jhyf.length;i++){
String mm_value = m_update[i];
if (mm_value.equals("0") == false){
String mm_mark = m_mark[i];
String mm_jhyf = m_jhyf[i];
Object[] ds = new Object[]{mm_jhyf};
Session session =getSessionFactory().getCurrentSession();
Transaction trans=session.beginTransaction();
service.updatefinishmark(mm_jhyf, mm_mark);
try {
service.updatefinishmark(mm_jhyf, mm_mark);
service.zzjhbak_en(hsql, ds);
} catch (SQLException e) {
trans.rollback();
// TODO Auto-generated catch block
e.printStackTrace();
}
trans.commit();
}
}
ActionForward forward = mapping.getInputForward();
forward = mapping.findForward("success");
return forward;
}
对底层数据库2个操作 一个是更新字段 一个调用存储过程,如果其中一个报错,2个操作都回滚,具体该怎么写啊 --------------------编程问答-------------------- 在线等,忘高手解答下,最好有具体的实现步骤代码 --------------------编程问答-------------------- lz的写法有什么问题? --------------------编程问答-------------------- Session session =getSessionFactory().getCurrentSession();这段有问题
getSessionFactory()这东西找不到 在ACTION里不识别,在HIBERNATE逆向工程生成的DAO层文件里就识别 --------------------编程问答-------------------- <?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<bean id="dataBase" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<property name="driverClass" value="oracle.jdbc.driver.OracleDriver"></property>
<property name="jdbcUrl" value="jdbc:oracle:thin:@192.168.1.58:1521:orcl"></property>
<property name="user" value="mes"></property>
<property name="password" value="wzh`751004"></property>
<property name="maxPoolSize" value="120"></property>
<property name="acquireIncrement" value="5"></property>
<property name="autoCommitOnClose" value="false"></property>
<property name="minPoolSize" value="1"></property>
<property name="initialPoolSize" value="5"></property>
<property name="maxIdleTime" value="20"></property>
</bean>
<bean id="sessionBean" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataBase" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
这是Spring的配置文件applicationContext.xml里面的内容 --------------------编程问答-------------------- 你的父类是struts1貌似是ActionServlet他当然没有getSessionFactory()方法了。建议你找Hibernate相关对象来调用吧,应该是个全局的,我不懂ssh的说,错了别骂我啊。 --------------------编程问答-------------------- 你把事务配置在action 不就可以了 --------------------编程问答-------------------- 哪能啊 不过我还是不明白 该怎么弄 再等等别人的回答吧 谢谢你啊 --------------------编程问答--------------------
有没有具体点的东西啊 我如果知道怎么配置事务 我就不问了 --------------------编程问答-------------------- getSessionFactory() 把这个方法拿出来看下 --------------------编程问答--------------------
。。。。。。。。。。。。。。。。。。。。。。。。没有啊 我根本没写啊 我那是直接从DAO文件里面拷贝过来的 在DAO文件里面那个getSessionFactory()直接可以用啊 --------------------编程问答-------------------- 你不是用Sring 吗 看说明文档啊 ,转到配置事务那段 直接复制下来 改下就好了 学会自己看文档啊 ,SSH文档那么齐全 --------------------编程问答-------------------- 第一,你代码写法有问题,trans.commit();应写在try块内部,如下面那样。
Session session =getSessionFactory().getCurrentSession();
Transaction trans=session.beginTransaction();
service.updatefinishmark(mm_jhyf, mm_mark);
try {
service.updatefinishmark(mm_jhyf, mm_mark);
service.zzjhbak_en(hsql, ds);
trans.commit();
} catch (SQLException e) {
trans.rollback();
// TODO Auto-generated catch block
e.printStackTrace();
}
第二,Session session =getSessionFactory().getCurrentSession();
你的错是什么你也没有贴出来,我觉得最有可能就是这个地方了吧,getSessionFactory是你自定义的方法?还是怎么的?你看下这个方法写法有没有错误,还有你导入包有没有问题。仔细检查检查吧,希望你能解决问题。 --------------------编程问答-------------------- http://www.cnblogs.com/bingoidea/archive/2011/04/01/2002200.html
你说的基本应该是这个东西,我放上也不怎么好用,基本有些就看不懂 --------------------编程问答--------------------
Session session =getSessionFactory().getCurrentSession();
没有啊 我根本没写啊 我那是直接从DAO文件里面拷贝过来的 在DAO文件里面那个getSessionFactory()直接可以用啊
--------------------编程问答-------------------- 还有没有人 帮我实现下啊 最好有步骤方法代码的 --------------------编程问答-------------------- getSessionFactory() 因为DAO extends hibernateDaoSupport这个类,但是你的action好像应该继承了别的类吧,
给点建议, 你既然用SSH , 那就吧Action的功能拆分出来吧,
你让spring管理事物, 切面定义在action中就OK了 --------------------编程问答-------------------- 切面定义在action中就OK了 --------------------编程问答--------------------
具体怎么做呢
我想要具体的实现方法啊 --------------------编程问答-------------------- 使用注解式事物:
1、在action类要使用事物的方法上加上:@Transactional
2、在applicationContext.xml中配置:
<!-- 配置Hibernate 的事务管理'-->
<bean id="txManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="mySessionFactory" />
</property>
</bean>
<!-- tx:annotation-driven元素的出现 开启 了事务行为 -->
<tx:annotation-driven transaction-manager="txManager" /> --------------------编程问答-------------------- 追加一下:
在applicationContext.xml头文件中,引入:
1<?xml version="1.0" encoding="UTF-8"?>
2.<beans
3. xmlns:tx="http://www.springframework.org/schema/tx"
4. http://www.springframework.org/schema/tx
--------------------编程问答-------------------- <bean id="dataBase" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<property name="driverClass" value="oracle.jdbc.driver.OracleDriver"></property>
<property name="jdbcUrl" value="jdbc:oracle:thin:@192.168.1.58:1521:orcl"></property>
<property name="user" value="mes"></property>
<property name="password" value="wzh`751004"></property>
<property name="maxPoolSize" value="120"></property>
<property name="acquireIncrement" value="5"></property>
<property name="autoCommitOnClose" value="false"></property>
<property name="minPoolSize" value="1"></property>
<property name="initialPoolSize" value="5"></property>
<property name="maxIdleTime" value="20"></property>
</bean>
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="sessionBean"/>
</bean>
<bean id="sessionBean" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataBase" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
怎么会报错呢 --------------------编程问答-------------------- <?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"
xmlns:tx="http://www.springframework.org/schema/tx">
<bean id="dataBase" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<property name="driverClass" value="oracle.jdbc.driver.OracleDriver"></property>
<property name="jdbcUrl" value="jdbc:oracle:thin:@192.168.1.58:1521:orcl"></property>
<property name="user" value="mes"></property>
<property name="password" value="wzh`751004"></property>
<property name="maxPoolSize" value="120"></property>
<property name="acquireIncrement" value="5"></property>
<property name="autoCommitOnClose" value="false"></property>
<property name="minPoolSize" value="1"></property>
<property name="initialPoolSize" value="5"></property>
<property name="maxIdleTime" value="20"></property>
</bean>
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataBase"/>
</bean>
<tx:annotation-driven transaction-manager="txManager" />
<bean id="sessionBean" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataBase" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
出错<tx:annotation-driven transaction-manager="txManager" />
前面有红叉 --------------------编程问答--------------------
我的情形跟你的有点不一样 我的HIBERNATE让SPRING托管了 所以写的方式跟你的有点差别 不过我看意思也差不多 为什么不好用呢 --------------------编程问答-------------------- 我发的就是spring集成hibernate的,出现红叉,说明,你的spring配置文件头有问题,正确的应该是:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
> --------------------编程问答-------------------- 红叉问题解决了 如果我SPRING托管HIBERNATE的话 该如何写呢 我发个 你仔细帮我看看
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<bean id="dataBase" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<property name="driverClass" value="oracle.jdbc.driver.OracleDriver"></property>
<property name="jdbcUrl" value="jdbc:oracle:thin:@192.168.1.58:1521:orcl"></property>
<property name="user" value="mes"></property>
<property name="password" value="wzh`751004"></property>
<property name="maxPoolSize" value="120"></property>
<property name="acquireIncrement" value="5"></property>
<property name="autoCommitOnClose" value="false"></property>
<property name="minPoolSize" value="1"></property>
<property name="initialPoolSize" value="5"></property>
<property name="maxIdleTime" value="20"></property>
</bean>
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataBase"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="sessionBean" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataBase" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>com/king/krs/pojo/TUser.hbm.xml</value>
<list>
</property>
</bean>
<bean id="UserDAO" class="com.king.krs.dao.impl.UserDAO">
<property name="sessionFactory">
<ref bean="sessionBean" />
</property>
</bean>
我这么写的 在ACTION中方法前面也加上@Transactional了 为什么就不行呢 还是能修改,第一方法修改数据库正确,第二个方法调用存储过程错误,为什么没回滚呢 --------------------编程问答-------------------- 这个是ACTION中的方法
@Transactional
private ActionForward update(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response){
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
ActionErrors errors = new ActionErrors();
ApplicationContext context = getWebApplicationContext();
IPlancloseService service = (IPlancloseService)context.getBean("PlancloseService");
zzjhfcForm zzForm = (zzjhfcForm) form;
String[] m_mark = zzForm.getRw_mark_yc();
String[] m_jhyf = zzForm.getYearmonth();
String[] m_update = zzForm.getUpdate_mark() ;
String hsql = "{call UP_ZZJHBAK_ORA(?)}";
for(int i=0;i<m_jhyf.length;i++){
String mm_value = m_update[i];
if (mm_value.equals("0") == false){
String mm_mark = m_mark[i];
String mm_jhyf = m_jhyf[i];
Object[] ds = new Object[]{mm_jhyf};
///stest s = new stest();
//Session session = s.getsession();
// Transaction trans=session.beginTransaction();
try {
service.updatefinishmark(mm_jhyf, mm_mark);
service.zzjhbak_en(hsql, ds);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//trans.commit();
}
}
ActionForward forward = mapping.getInputForward();
forward = mapping.findForward("success");
return forward;
}
--------------------编程问答-------------------- 哥们 帮我仔细看看上面哪有问题 我再追加点分 全给你 --------------------编程问答-------------------- SessionFactory mySessionFactory = new Configuration().configure(
"hibernate.cfg.xml").buildSessionFactory();
你懂的 --------------------编程问答-------------------- 将你spring配置文件中的:
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataBase"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
替换为:
<!-- 配置Hibernate 的事务管理'-->
<bean id="txManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionBean" />
</property>
</bean>
<!-- tx:annotation-driven元素的出现 开启 了事务行为 -->
<tx:annotation-driven transaction-manager="txManager" />
加载顺序,这两个替换内容,应该放到spring配置文件末尾 --------------------编程问答-------------------- --------------------编程问答-------------------- 追加:
在spring配置文件中已经配置好了事物,那么,在action类的方法中,直接注入:@Transactional
就行了,不需要显式的去操作事物。commit,rollback等,全部去掉,以前是怎么写action方法的,就怎么写。 --------------------编程问答--------------------
我的项目中根本就没有hibernate.cfg.xml这个文件 --------------------编程问答--------------------
还是没好用啊 是不是因为我第一次是修改数据库,第二次是调用的存储过程的问题。 --------------------编程问答-------------------- <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<bean id="dataBase" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<property name="driverClass" value="oracle.jdbc.driver.OracleDriver"></property>
<property name="jdbcUrl" value="jdbc:oracle:thin:@192.168.1.58:1521:orcl"></property>
<property name="user" value="mes"></property>
<property name="password" value="wzh`751004"></property>
<property name="maxPoolSize" value="120"></property>
<property name="acquireIncrement" value="5"></property>
<property name="autoCommitOnClose" value="false"></property>
<property name="minPoolSize" value="1"></property>
<property name="initialPoolSize" value="5"></property>
<property name="maxIdleTime" value="20"></property>
</bean>
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataBase"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="sessionBean" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataBase" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>com/king/krs/pojo/TUser.hbm.xml</value>
<list>
</property>
</bean>
<bean id="UserDAO" class="com.king.krs.dao.impl.UserDAO">
<property name="sessionFactory">
<ref bean="sessionBean" />
</property>
</bean>
我这么写的 在ACTION中方法前面也加上@Transactional了 为什么就不行呢 还是能修改,第一方法修改数据库正确,第二个方法调用存储过程错误,为什么没回滚呢
这个是ACTION中的方法
@Transactional
private ActionForward update(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response){
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
ActionErrors errors = new ActionErrors();
ApplicationContext context = getWebApplicationContext();
IPlancloseService service = (IPlancloseService)context.getBean("PlancloseService");
zzjhfcForm zzForm = (zzjhfcForm) form;
String[] m_mark = zzForm.getRw_mark_yc();
String[] m_jhyf = zzForm.getYearmonth();
String[] m_update = zzForm.getUpdate_mark() ;
String hsql = "{call UP_ZZJHBAK_ORA(?)}";
有空的帮我看下 问题出在哪了 --------------------编程问答--------------------
我也有类似跟你一样的需求, 你问题解决了吗?
补充:Java , Web 开发