gpt4 book ai didi

spring - 我应该在使用@Transactional 时使用 beginTransaction 吗?

转载 作者:行者123 更新时间:2023-12-05 00:59:35 25 4
gpt4 key购买 nike

我对 Spring 和 Hibernate 事务很困惑。我有以下示例代码。

我想知道是否

  • 这是一种正确的检索方式。
  • 我应该使用 getCurrentSession().beginTransaction()同样,我应该将它与 @Transactional 一起使用吗?根本?

  • 配置
     <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"
    destroy-method="close">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost:2000/HiberProject" />
    <property name="username" value="jack" />
    <property name="password" value="jack" />
    </bean>

    <bean id="sessionFactory"
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"
    depends-on="dataSource">
    <property name="dataSource" ref="dataSource" />
    <property name="packagesToScan" value="com.hiberproject.model" />
    <property name="hibernateProperties">
    <props>
    <prop key="hibernate.format_sql">true</prop>
    <prop key="hibernate.use_sql_comments">true</prop>
    <prop key="hibernate.show_sql">true</prop>
    <prop key="hibernate.hbm2ddl.auto">update</prop>
    </props>
    </property>
    </bean>

    <bean
    class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />
    <bean id="transactionManager"
    class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
    </bean>

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

    服务
    @Service
    public class SampleRecordsServiceImpl implements SampleRecordsService{

    @Autowired
    SampleRecordsRepository sampleRecordsRepository;

    @Override
    @Transactional(readOnly=true)
    public Record retrieveRecord(long id){
    return sampleRecordsRepository.retrieveRecord(id);
    }
    }

    存储库
    @Repository
    public class SampleRecordsRepository implements SampleRecordsRepository{

    @Autowired
    SessionFactory sessioFactory;

    @Override
    public Record retrieveRecord(long id){
    return (Record) sessionFactory.getCurrentSession().get(Record.class,id);
    }
    }

    最佳答案

    @Transactional注释本身定义了单个数据库事务的范围。数据库事务发生在持久化上下文的范围内。

    持久化上下文只是一个同步器对象,它跟踪一组有限的 Java 对象的状态,并确保这些对象上的更改最终会持久化回数据库。

    对于 @Transactional您可以使用 Propagation 设置传播属性的注释你可以用不同的方式处理你的行为,比如 Propagation.REQUIRES_NEW (如果您需要对每个请求进行新的交易)。默认传播是 REQUIRED .
    session.beginTransaction()如果不存在,也将开始一个新事务,或者它将使用现有事务来开始指定的工作单元。

    因此,您应该使用其中一种方法来管理事务。

    关于spring - 我应该在使用@Transactional 时使用 beginTransaction 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30586852/

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