Spring Boot中的@Transactional

3

Spring Boot是否会自动在控制器层添加@Transactional注解?我尝试将@Transactional放在服务层,但似乎控制器层会覆盖该注解。

我有以下配置:

<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="find*" read-only="true" isolation="READ_COMMITTED"
            propagation="NOT_SUPPORTED" />
        <tx:method name="load*" read-only="true" isolation="READ_COMMITTED"
            propagation="NOT_SUPPORTED" />
        <tx:method name="get*" read-only="true" isolation="READ_COMMITTED"
            propagation="NOT_SUPPORTED" />
        <tx:method name="*" timeout="30" propagation="REQUIRED" />
    </tx:attributes>
</tx:advice>

<aop:config proxy-target-class="true">
    <aop:advisor advice-ref="txAdvice"
        pointcut="execution(* *..service.*Service*.*(..))" order="1" />
</aop:config>

即使我删除了该配置,交易仍然有效。

编辑:

这是我的数据源配置。

<bean id="msDataSource" class="org.apache.tomcat.jdbc.pool.DataSource"
    destroy-method="close">
    <property name="driverClassName" value="${jdbc.main.driverClass}" />
    <property name="url" value="${jdbc.main.url}" />
    <property name="username" value="${jdbc.main.username}" />
    <property name="password" value="${jdbc.main.password}" />

</bean>


<bean id="msPUM"
    class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager">
    <property name="defaultDataSource" ref="msDataSource" />
</bean>

<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitManager" ref="msPUM" />
    <!--<property name="jpaVendorAdapter"> <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
        <property name="database" value="ORACLE"/> <property name="generateDdl" value="false"/> 
        <property name="showSql" value="true" /> </bean> </property> -->
</bean>

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

你是因为什么感觉这样? - Arpit Aggarwal
我已经编辑了这个问题。 - Ryan Guamos
我在这里没有看到任何控制器代码。你怎么会认为当你禁用事务建议控制器时,控制器会自动在事务中执行代码呢? - Nitin Arora
1个回答

5

我猜测您想问的是为什么可以在控制器中加载实体内的延迟集合?相关的内容与IT技术有关。

Spring Boot配置了应用程序属性spring.jpa.open-in-view,默认值为“true”。这会为整个请求打开一个会话,使得在没有@Transactional的情况下,您可以像上述那样执行操作。

如果您希望关闭该功能,请将以下内容添加到您的application.properties文件中:

spring.jpa.open-in-view=false


我讨厌Spring Boot。 - Martin Čuka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接