当前位置:编程学习 > JAVA >>

关于spring处理事物的问题

小弟今天用spring配置处理hibernate的事物,遇到了这样一个问题,如下:

//使用spring配置hibernate
<bean id="sessionFactory" 
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource">
</property>
<property name="hibernateProperties">
<props>
<prop key="dialect">${dialect}</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>com/myorg/entity/User.hbm.xml</value>
<value>com/myorg/entity/Notify.hbm.xml</value>
<value>com/myorg/entity/Carspace.hbm.xml</value>
<value>com/myorg/entity/House.hbm.xml</value>
<value>com/myorg/entity/Role.hbm.xml</value>
</list>
</property>
   </bean>
   
   
   <!-- 配置声明事务管理 -->
<!-- 事务管理 -->
<bean id="hibernateTransactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- 定义事务规则(事务通知) -->
<tx:advice id="transactionAdvice"
transaction-manager="hibernateTransactionManager">
<tx:attributes>
                        //如下配置后,更新,删除,查询没有问题  插入有问题
<tx:method name="save*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="modify*" propagation="REQUIRED" />
<tx:method name="delete*" propagation="REQUIRED" />
<tx:method name="find*" propagation="NOT_SUPPORTED"
read-only="true" />
<tx:method name="Check*" propagation="NOT_SUPPORTED"
read-only="true" />
<tx:method name="get*" propagation="NOT_SUPPORTED"
read-only="true" />
</tx:attributes>
</tx:advice>
<!--定义方面完成织入-->
<aop:config>
<!-- 定义切面 -->
<aop:pointcut id="tranPointCut"
expression="execution(* com.myorg.service.*.*(..))" />
<!-- 完成织入 -->
<aop:advisor advice-ref="transactionAdvice"
pointcut-ref="tranPointCut" />
</aop:config>

  其他的配置都没问题,
这样配置后,删除,修改,查询 是没有什么问题的,但是插入有问题,控制台能够打印出插入语句,但是数据库根本没有插入记录。不知道是不是提交的问题   另外,我使用了opensessionInView.
劳烦大家帮一下忙啊 搞了一下午了...

    spring hibernate --------------------编程问答-------------------- 按理来说这样配置是没有问题的;真的有问题可能有2种情况:
1、检查是不是你的插入方法名没有以save开头;
2、检查你插入方法存在的路径是不是在aop中定义的规则下。

我也不是很懂这个,只能说说我的看法,希望帮到你
--------------------编程问答-------------------- 你先验证一下是否所有的类都是这样,如果只是某个类那就检查一下映射文件,会不会映射里面用了Not null 而又没有为此属性赋值.如果所有类都这样,按楼上的再看看.还要注意OpenSessionInviewFilter应该在Struts2之类的框架的过滤器前面. --------------------编程问答-------------------- <tx:method name="save*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="modify*" propagation="REQUIRED" />
<tx:method name="delete*" propagation="REQUIRED" />
<tx:method name="find*" propagation="NOT_SUPPORTED"
read-only="true" />
<tx:method name="Check*" propagation="NOT_SUPPORTED"
read-only="true" />
<tx:method name="get*" propagation="NOT_SUPPORTED"
read-only="true" />
lz你service中的每个业务方法是否都是这样命名的?加上事务的话,每个方法都有一个特殊的标记!查询的时候不用加事务,做数据库更新的时候,加上事务! --------------------编程问答-------------------- 注意方法开头的标识
补充:Java ,  Web 开发
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,