gpt4 book ai didi

Spring Hibernate 事务管理

转载 作者:行者123 更新时间:2023-12-04 17:31:18 24 4
gpt4 key购买 nike

我刚刚开始使用 spring 和 hibernate 制作一个项目。我的 DAO 层类扩展了 HibernateDaoSupport。我们没有使用注释。
之前,我们使用的是 struts,因此我们使用了 Session 类提供的 getTransaction、commit、rollback .. 方法。
我的要求很简单,对于所有的 DAO 类,如果有异常,则回滚,否则提交。请提出一个最简单的介绍 spring 事务管理的方法。

最佳答案

从您的问题中,有几件事不清楚。我的解释基于以下假设 -

  • 您正在使用 spring 创建数据源和 session 工厂
  • 您使用的是 Java 5 或更高版本,可以使用注释。

  • 这是您的 Spring 配置的样子。
        <bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close">
    <property name="driverClassName" value="org.hsqldb.jdbcDriver" />
    <property name="url" value="jdbc:hsqldb:hsql://localhost:9001" />
    <property name="username" value="sa" />
    <property name="password" value="" />
    </bean>

    <bean id="mySessionFactory"
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="myDataSource" />
    <property name="mappingResources">
    <list>
    <value>product.hbm.xml</value>
    </list>
    </property>
    <property name="hibernateProperties">
    <value>
    hibernate.dialect=org.hibernate.dialect.HSQLDialect
    </value>
    </property>
    </bean>

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

    <tx:annotation-driven transaction-manager="transactionManager" />

    设置完成后,您可以在 DAO 方法上使用 spring 事务注释,如下所示。 Spring 将负责启动事务、提交事务或在抛出异常时回滚事务。如果您有业务服务,最好在您的服务上使用事务注释而不是 DAO。
    @Transactional(propagation=Propagation.REQUIRED)
    public class MyTestDao extends HibernateDaoSupport {
    public void saveEntity(Entity entity){
    getHibernateTemplate().save(entity);
    }
    @Transactional(readOnly=true)
    public Entity getEntity(Integer id){
    return getHibernateTemplate().get(Entity.class, id);
    }
    }

    下面的代码显示了如何使用 spring 对 AOP 的支持而不是注释来实现事务管理。
        <!-- Define your 'myDatasource' bean and 'mySessionFactory' bean as shown in previous code snippet -->
    <!-- Then follow the steps shown below -->

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

    <!-- this is the dao object that we want to make transactional -->
    <bean id="testDao" class="com.xyz.daos.MyTestDao" />

    <!-- the transactional advice -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
    <!-- all methods starting with 'get' are read-only -->
    <tx:method name="get*" read-only="true" />
    <!-- other methods use the default transaction settings (see below) -->
    <tx:method name="*" propagation="REQUIRED" />
    </tx:attributes>
    </tx:advice>

    <!-- ensure that the above transactional advice runs for any execution of
    a method in 'daos' package-->
    <aop:config>
    <aop:pointcut id="allDaoMethods"
    expression="execution(* com.xyz.daos.*(..))" />
    <aop:advisor advice-ref="txAdvice" pointcut-ref="allDaoMethods" />
    </aop:config>

    欲知更多详情,请参阅——
    Spring Declarative Transactions

    关于Spring Hibernate 事务管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13087928/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com