JAVA SSH框架 hibernate 关于事务问题
如图,有几个步骤分别操作几个不同的数据表,如果有一步出错,则回滚,这个该怎么加事务?这个是Spring配置是这样的,现在我想知道该怎么给上述的方法添加事务。...
如图,有几个步骤分别操作几个不同的数据表,如果有一步出错,则回滚,这个该怎么加事务?
这个是Spring配置是这样的,现在我想知道该怎么给上述的方法添加事务。 展开
这个是Spring配置是这样的,现在我想知道该怎么给上述的方法添加事务。 展开
5个回答
展开全部
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation">
<value>classpath:hibernate.cfg.xml</value>
</property>
</bean>
<!-- 配置事务管理器 -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
<!-- 启用注解方式的事务配置 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
首先在spring里面添加事务的配置,然后给service方法添加事务注解就可以了
@Transactional(rollbackFor=Exception.class),记住要是service里面加事务注解,事务配置的方法不同,我给的这个适合系统全部使用注解的情况,添加事务注解后,只要代码里面有异常,spring会自动回滚,不然你整ssh干什么呢
spring里面要加下面的命名空间,可以在网上看别人怎么配的
xmlns:tx="http://www.springframework.org/schema/tx"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation">
<value>classpath:hibernate.cfg.xml</value>
</property>
</bean>
<!-- 配置事务管理器 -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
<!-- 启用注解方式的事务配置 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
首先在spring里面添加事务的配置,然后给service方法添加事务注解就可以了
@Transactional(rollbackFor=Exception.class),记住要是service里面加事务注解,事务配置的方法不同,我给的这个适合系统全部使用注解的情况,添加事务注解后,只要代码里面有异常,spring会自动回滚,不然你整ssh干什么呢
spring里面要加下面的命名空间,可以在网上看别人怎么配的
xmlns:tx="http://www.springframework.org/schema/tx"
追问
加这个之后是不是不再需要配置。只要在想要加事务的方法上加注解就可以,是不是这个意思?另外我的问题是如果其中一步出错,回滚了,我该怎么判断出错了,要提示客户?求大侠指点···
追答
是的,可以不用配置aop,aop也是一中事务配置方式。
对于抛出的异常,如果是hibernate异常,正常应该是你代码的问题吧,
如果是你自己抛出的异常,你可以在异常信息里面加一些描述信息(带上一些头,如“提示:*****”),在action里面把捕获你自己定义的异常,然后提示用户就是了
如果出现你能够预料到的hibernate异常,你也可以捕获,再抛出你的异常,再action捕获你抛得异常提示用户
展开全部
在这个方法开始:
Session session = SessionFactory.openSession();
session.setFlushMode(FlushMode.MANUAL);
Transaction tran = session.beginTransanction();
try{
...//具体做的事务
tran.commit();
}
catch(Exception){
tran.rollback();
}finally{
session.close();
}
这是一个事务的基本逻辑,就是Spring帮你做,也是同样道理,把我写的代码部分配置好几个切面,你只需要写你的事务部分。
按你配置的那个spring已经是配置好的了啊,你只需要把方法写在org.foxking.service下的任意类的任意public方法里啊。注意: 子包不行,AOP最多下一层,那也需要你得把切面配成execution(* org.foxking.service..*.*(..)) 再多层子包就不行了。
Session session = SessionFactory.openSession();
session.setFlushMode(FlushMode.MANUAL);
Transaction tran = session.beginTransanction();
try{
...//具体做的事务
tran.commit();
}
catch(Exception){
tran.rollback();
}finally{
session.close();
}
这是一个事务的基本逻辑,就是Spring帮你做,也是同样道理,把我写的代码部分配置好几个切面,你只需要写你的事务部分。
按你配置的那个spring已经是配置好的了啊,你只需要把方法写在org.foxking.service下的任意类的任意public方法里啊。注意: 子包不行,AOP最多下一层,那也需要你得把切面配成execution(* org.foxking.service..*.*(..)) 再多层子包就不行了。
追问
那么还需要去这个方法进行@Transactional()注解么?我现在的配置应该是对所有包的所有方法都有事务,但是实际上,当运行项目,某一步出错的时候是不往下执行,前面的也回滚了,但是我要在页面上提示用户操作失败,那么我又对每一步做处理例如:try{ 第一步;}catch{ bl=false;}最终,当第四步出错的时候,前面几步是执行成功了的,求分析解答,感激不尽··
追答
首先,不需要@Transacional注解,这个注解的作用就是配置TransactionManager那些Arrtribute,就是配置tx:method,因为一般@Transactional都是写在方法上的,写在类上也是说给这个service的类的所有方法都注解为事务方法。
你是需要把那几步分成不同的事务进行处理吧? 这样就是你分层时出现的问题了。你在业务层把那四步放在四个不同的方法里,在控制层依依去调不就搞定了么?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
修改<aop:pointcut>节点的expresion属性,修改其中的org.foxking.service.*.*为当前要启用类的路径
追问
我这个胚配置应该是算对所有包所有方法进行事务管理了吧
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
第一步之前加入事务
第四步之后决定commit还是rollback
第四步之后决定commit还是rollback
追问
求大神详细一段代码,新人表示压力山大···
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
transactionManager
commit
commit
追问
希望大侠能详细写一段代码
追答
工作呢,没有这样hibernate直接写的事务代码,家里电脑有,工作的工程都是spring接管配置事务的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询