当前位置: 首页 > 知识库问答 >
问题:

@事务注释不工作

丁学
2023-03-14

我正在尝试在数据库中保存TestEntity对象。正在执行代码并创建实体的Id,但实体未持久化到数据库(未插入行):

@Repository
public class DBConnectionConfig {
    @Autowired
    SessionFactory sessionFactory;
    DBConnectionConfig(){
        //this.sessionFactory=getSessionFactory();
    }
    /*private SessionFactory getSessionFactory() {
        return sessionFactory;
    }
    private void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }*/
    public Session getSession(){
        return sessionFactory.openSession();
    }
}


package com.homecare.persistance.repository;
@Repository
@Transactional
public class HomeCareDaoImp extends DBConnectionConfig  implements HomeCareDao{
    Logger LOGGER=Logger.getLogger("Connection.class");
    Session session=null;
    Transaction trnx=null;
    @Autowired
    ApplicationContext ctx;
    @Autowired
    DBConnectionConfig dBConnectionConfig;
    public void doaProcess(TestEntity testEntity){
        LOGGER.info(dBConnectionConfig.toString());
        session=getSession();
        // trnx=session.beginTransaction();
        session.save(testEntity);
        // session.flush();
        // trnx.commit();
        LOGGER.info("connection established");
    }
}

从三行(beginTransation,flush,commit)中删除注释解决了问题,但是为什么@transactional注释在这里不起作用呢?

spring XML:

<!-- Our service layer components -->
<context:component-scan base-package="com.homecare" />
<!-- <context:component-scan base-package="com.homecare.persistance.repository" /> -->


 <!-- enable @Transactional Annotation -->



<!-- data source with c3p0 -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
      <property name="driverClassName" value="org.postgresql.Driver" />
      <property name="url" value="jdbc:postgresql://localhost:5433/My_DB" />
      <property name="username" value="postgres" />
      <property name="password" value="password" />
   </bean>

   <bean id="SessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
      <property name="dataSource" ref="dataSource" />
      <property name="packagesToScan" value="com.homecare.persistance.resource"></property>   <!-- yet to defined place where to scan> -->
      <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
            </props>
        </property>
    </bean>

    <tx:annotation-driven transaction-manager="transactionManager"/>
    <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
      <property name="sessionFactory" ref="SessionFactory" />
   </bean>
</beans>

POM xml文件:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>4.3.2.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>4.3.2.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>4.3.2.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-orm</artifactId>
    <version>4.3.2.RELEASE</version>
</dependency>



<!-- spring framwork -->
<!-- Hibernate -->
       <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>4.3.11.Final</version>
       </dependency>
        <dependency>
           <groupId>net.sf.ehcache</groupId>
           <artifactId>ehcache-core</artifactId>
           <version>2.2.0</version>
       </dependency>

共有2个答案

狄旭
2023-03-14

尝试重写getSession()方法:

@Repository
@Transactional
public class HomeCareDaoImp extends DBConnectionConfig  implements HomeCareDao{
    Logger LOGGER=Logger.getLogger("Connection.class");
    Session session=null;
    Transaction trnx=null;

    @Autowired
    ApplicationContext ctx;

    public void doaProcess(TestEntity testEntity){
            LOGGER.info(dBConnectionConfig.toString());
            session=getSession();
            // trnx=session.beginTransaction();
            session.save(testEntity);
            // session.flush();
            // trnx.commit();
            LOGGER.info("connection established");
        }

    @Override
    public void getSession() {
        super.getSession();
    }   
  }
史骏祥
2023-03-14

用于保存的Hibernate会话对象未绑定到spring配置XML中定义的事务管理器。

使用autowired定义sessionfactory对象为

@Autowired
Private SessionFactory sessionFactory;

并将会话对象提取为

Session session = sessionFactory.getCurrentSession();

现在执行session.save(对象);

根据代码中的spring配置,sessionFactory与TransactionManager关联。因此,当事务成功完成时,会话(与事务管理器相关联)执行的所有更改都将提交到db中。

 类似资料:
  • 我将Spring 3.2.4与JavaFX结合使用,并希望实现一种方法,其中操作将在事务中执行。我在控制器中的代码如下所示: 以及我的应用程序上下文: 尝试运行时,我收到以下错误消息: 该方法存在。删除注释,或者将方法从public更改为private,或者从配置中删除bean,程序就会运行,但事务注释根本不起作用。删除代理目标会导致另一个错误。

  • 问题内容: 之间有什么区别? 在整个类中添加“ @Transactional”注释 为每个方法添加“ @Transactional”注释? 使用spring和Hibernate吗? 问题答案: 基本上,如果您用所有方法注释该类,则将是事务性的。如果您不这样做,则可以仅将其标注为所需的方法。此外,你可以为每个方法指定不同的属性,如,,,…

  • 根据我的理解,在methodB()中,我们使用someManager保存一个对象,并调用另一个函数callToSomeOtherServer()。所以这是上层方法中事务的一部分。如果callToSomeOtherServer()失败并抛出someException,整个事务应该回滚,保存的对象不应该在DB中反映。 但这对我不起作用,对象反映在DB中。有人能帮忙让我明白为什么它不起作用吗?

  • 我正在使用MongoDB的springboot 2.3.0。注释对我不起作用。如果发生异常,则无法回滚事务。 任何帮助都将得到高度赞赏。 我的控制器类: 我的serviceImpl类 我的MongoConfig类

  • 在我们的一个项目中,我们遇到了一个问题,Spring忽略了事务注释,然后失败了,出现了以下错误。 启动ApplicationContext时出错。要显示条件报告,请在启用“调试”的情况下重新运行应用程序。2018-09-13 15:05:18406错误[主]组织。springframework。靴子SpringApplication应用程序运行失败组织。springframework。道。Inva

  • 我正在阅读使用Spring框架的事务管理。在第一个组合中,我使用Spring Hibernate和Hibernate的API来控制事务(Hibernate API)。接下来,我想使用注释进行测试,它确实起了作用。 我感到困惑的是: > JPA、JTA、Hibernate是否有自己的事务管理方式。举个例子,考虑如果我使用Spring Hibernate,在那种情况下,你会使用“JPA”事务吗? 就像