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

使用事务注释时未出现活动事务错误,则获取保存无效

叶稳
2023-03-14

我在我的应用程序中使用了Spring冬眠球衣。我想使用事务,因此我在服务图层中使用了 spring @Transactional 注记。这是我的Hibernate.cfg.xml:

<hibernate-configuration>
  <session-factory>
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/db</property>
    <property name="hibernate.connection.username">user</property>
  </session-factory>
</hibernate-configuration>

我没有在这里使用session_context,所以Spring可以管理它。在我的应用程序Context.xml中,我定义了事务管理器:

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
    <property name="driverClass" value="com.mysql.jdbc.Driver"/>
    <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/db"/>
    <property name="user" value="username"/>
</bean>

<context:annotation-config/>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="configLocation">
        <value>classpath:hibernate.cfg.xml</value>
    </property>
    <property name="packagesToScan">
        <list>
            <value>com.hibernate.pojos</value>
        </list>
    </property>
</bean>

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

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

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

所有与 /api/v1/* 匹配的 url 都映射到名为泽西岛的服务器和使用的 servlet 类是 com.sun.jersey.spi.spring.container.servlet.SpringServlet 我已将 com.services 作为要扫描的软件包传递给它。在这个包中,我有一个类:

@Path("/app")
@Component
public class testApi() {
    @Autowired
    private DAOImpl daoimpl;

    @POST
    @Path("/create")
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    @Transactional(rollbackFor = {Exception.class})
    public Map<String,Object> testHello(user u) {
        Map response = daoimpl.save(u);
        return response;
    }
}

类< code>daoimpl具有自动连接的sessionFactory,并使用< code > session factory . getcurrentsession()方法来获取会话。方法< code>daoimpl.save(obj)只是将它保存在db中。因为我已经将testHello标记为事务性的,所以我希望开始一个由spring管理的事务,然后控制应该转到daoimpl,在那里进行实际的保存。但是如果没有活动的事务,我的保存是无效的。我看到很多帖子提到了hibernate配置中的session_context,正因为如此,spring无法处理事务。但是在我的例子中,我已经确保不提供任何session_context。我错过了什么?我甚至尝试将@transactional添加到DAO中,因为在我的示例应用程序中,我只是为一个服务发出一个DB调用。但是这也不管用。

共有1个答案

芮立果
2023-03-14

好吧,可能是你通过Hibernate指定一个会话工厂.cfg.xml然后在Spring中再次指定会话工厂,该工厂被传递给事务管理器。

不确定说实话,但是我从未使用过hibenate.cfg.xml然后为我工作(按照您指定的事务配置添加)。这也为您提供了将连接参数指定为属性的优势,并允许您通过Spring配置文件或其他一些机制轻松交换数据库配置。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 
                                                http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd">

        <bean id="sessionFactory"
                class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
                <property name="dataSource" ref="dataSource" />
                <property name="packagesToScan">
                        <list>
                                <value>uk.co.xyz.domain</value>
                        </list> 
                </property>
                <property name="hibernateProperties">
                        <props>
                                <prop key="hibernate.show_sql">${hibernate.showsql}</prop>
                                <prop key="hibernate.format_sql">true</prop>
                                <prop key="hibernate.dialect">${hibernate.dialect}</prop>
                                <prop key="hibernate.hbm2ddl.auto">${hibernate.ddlauto}</prop> 
                                <prop key="hibernate.cache.use_second_level_cache">${hibernate.enablecache}</prop>
                                <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
                        </props>
                </property>
        </bean>

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

</beans>

参见此处,这实际上暗示了不该发生的事情:

带有datasource的applicationContext.xml或hibernate.cfg.xml .区别?

 类似资料:
  • 问题内容: 我正在创建应用程序并在其中使用一些hibernate的东西。我要做的就是将实体保存到数据库中,但我不断收到此异常: 起初,我遇到了这个异常: 然后,我发现需要将其添加到我的hibernate配置中: 这解决了这个问题,但是现在出现了上面的问题。我将实体保存到这样的数据库中: 我的hibernate.cfg.xml文件如下所示: 我在用: Hibernate-4.1.4.Final JD

  • 我想将我的axis2项目与spring集成在一起。我按照本指南加载了一个spring applicationContext。 https://axis.apache.org/axis2/java/core/docs/spring.html 简而言之 以下是我的axis2版本服务: 问题:当轴调用 getResponse() 方法时,dao 设法获取注入的会话工厂(和Hibernate会话),但是当

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

  • 在服务类中放置“”批注时,出现以下错误 描述: bean“student service”无法作为“”注入,因为它是实现:com.student.service.studentService的JDK动态代理 示例代码: 行动: 考虑注入bean作为其接口之一,或者通过在和/或上设置来强制使用基于CGLIB的代理。 进程已完成,退出代码为%1 这是什么原因造成的?

  • 我对Spring交易非常陌生。由于我的组织使用的一些代码标准,我要求在调用任何方法时加入父事务(如果存在)。 我的应用程序是一个SpringMVC应用程序,有三层 Web层(控制器类) 服务层(包含业务逻辑的服务类) DAO Layer(数据库相关查询的DAO(数据访问层)类) 现在,在服务层上的一个方法中使用了dao层的三种不同方法。我使用@transactional将此服务方法注释为事务性的。

  • 在db会话监视器中,当这种情况发生时,我得到了一个不活动的事务。 我得到的错误如下: 问题是交易和连接应该自动打开和关闭...我希望并发修改失败的事务得到回滚...但似乎他们变得不活跃了。