RoyJing 2015-06-25 01:55 采纳率: 0%
浏览 4303
已结题

hibernate 手动控制事务回滚失败

spring配置:





5
20
100
5
100

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="dataSource" /> 
    <property name="hibernateProperties">
        <value>
            hibernate.dialect=org.hibernate.dialect.MySQLDialect
            hibernate.show_sql=true
            hibernate.format_sql=false
        </value>
    </property>
    <property name="packagesToScan" value="com.art8k.platform.*.*.bean"/>
</bean>

<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

<tx:advice id="txAdvice" transaction-manager="txManager">
    <tx:attributes>
        <tx:method name="get*" read-only="true"/>
        <tx:method name="find*" read-only="true"/>
        <tx:method name="list*" read-only="true"/>
        <tx:method name="*" rollback-for="Exception"/>
    </tx:attributes>
</tx:advice>
<aop:config>
    <aop:pointcut id="operation" expression="execution(* com.art8k.platform..service.*.*(..))" />
    <aop:advisor advice-ref="txAdvice" pointcut-ref="operation" />
</aop:config>
<bean id="dao" class="com.art8k.platform.dao.IDaoManager">
     <property name="sessionFactory">
        <ref bean="sessionFactory"/>    
    </property>
</bean>
<bean id="baseService" abstract="true" class="com.art8k.platform.service.BaseService">
    <property name="dao">
        <ref bean="dao"/>
    </property>
</bean>

BaseService.java
public BaseService() {
    if (SpringUtil.getWebApplicationContext()!=null && SpringUtil.getWebApplicationContext().getBean("dao") != null) {
        this.dao = (IDaoManager) SpringUtil.getWebApplicationContext().getBean("dao");
    }
}

/**
 * 数据库操作 dao
 */
@SuppressWarnings("unchecked")
@Resource
protected IDaoManager dao;

@SuppressWarnings("unchecked")
public void setDao(IDaoManager dao) {
    this.dao = dao;
}

@SuppressWarnings("unchecked")
public IDaoManager getDao() {
    return dao;
}

IDaoManager.java
public class IDaoManager<T, P, PK extends Serializable> extends HibernateDaoSupport implements GeneraDAO<T, P, PK> {

/**
 * <p>
 * 持久化业务逻辑数据对象 ,无返回值
 * </p>
 */
public void saveIObject(final T object) {
    getHibernateTemplate().save(object);
}

/**
 * <p>
 * 持久化业务逻辑数据对象,新增或者更新 ,无返回值
 * </p>
 * 
 * @param object
 *            T 业务逻辑数据对象
 */
public void saveOrUpdateIObject(final T object) {
    getHibernateTemplate().saveOrUpdate(object);
}

我自己的service集成BaseService,我在service里的一个方法内插入两条数据,如果出现异常,把本次对数据库的所有操作回滚,现在问题是回滚失败,代码如下:
public int saveProduct(HmProduct hmProduct) {
int result = ConstanData.SUCCESSCODE;
Session sessions = null;
sessions = this.getDao().getHibernateTemplate().getSessionFactory().openSession();
sessions.beginTransaction();
try {
sessions.save(hmProduct);
HmProductLog hmProductLog = new HmProductLog();
hmProductLog.setProductId(hmProduct.getId());
hmProductLog.setPrice(hmProduct.getPrice());
hmProductLog.setCreateTime(new Date());
sessions.save(hmProductLog);

    } catch (Exception e) {
        // TODO Auto-generated catch block
        sessions.getTransaction().rollback();
        result = ConstanData.FAILURECODE;
        e.printStackTrace();
    }finally{
        sessions.close();
    }
    return result;
}
  • 写回答

1条回答 默认 最新

  • X元素 2015-06-25 02:59
    关注

    先看spring版本,低版本需要设置编程式事务,在类中使用curentsession,与当前线程绑定。

    评论

报告相同问题?

悬赏问题

  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
  • ¥15 C#调用python代码(python带有库)
  • ¥15 矩阵加法的规则是两个矩阵中对应位置的数的绝对值进行加和
  • ¥15 活动选择题。最多可以参加几个项目?
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)
  • ¥20 怎么在stm32门禁成品上增加查询记录功能
  • ¥15 Source insight编写代码后使用CCS5.2版本import之后,代码跳到注释行里面