@RestController方法似乎默认情况下是事务性的,为什么?

使用Spring Boot 1.3.1

我不明白为什么默认情况下@RestController是Transactionnal。我在文档中什么都没说。

将以下事实推为以下控制器中的方法findOne()的示例为Transactionnal:

@RestController

@RequestMapping("/books")

public class BookController {

@RequestMapping("/{id}")

public Book findOne(@PathVariable Long id) {

Book book = this.bookDao.findOneBookById(id);

// following line

// => triggers a select author0_.id as id1_0_0_ etc... // where author0_.id=?

System.out.println(book.getAuthor().getFirstname());

return book;

}

}

带有System.out.println(book.getAuthor()。getFirstname());的行

应该在这里成功引发LazyInitiaizationFailure

BUT并触发作者选择。因此,findOne方法似乎是事务处理的。使用eclipse调试器,我可以确定确实是这条线触发了补充选择。但是为什么该方法是事务处理的呢?

@Configuration

@ComponentScan(basePackageClasses = _Controller.class)

@Import(BusinessConfig.class)

public class WebConfig extends WebMvcConfigurerAdapter {

// ... here the conf to setup Jackson Hibernate4Module

}

@Configuration

@EnableAutoConfiguration

@EnableTransactionManagement

@EntityScan(basePackageClasses = _Model.class)

@ComponentScan(basePackageClasses = { _Dao.class })

public class BusinessConfig {

}

@SpringBootApplication

public class BookstoreStartForWebEmbedded {

public static void main(String[] args) {

SpringApplication.run(BookstoreStartForWebEmbedded.class, args);

}

}

libs :

spring-boot-starter 1.3.1.RELEASE

spring-boot-starter-test : 1.3.1.RELEASE

spring-boot-starter-valisation : 1.3.1.RELEASE

spring-boot-starter-web : 1.3.1.RELEASE

spring-boot-starter-data-jpa : 1.3.1.RELEASE

postgresql: 9.4-1206-jdbc41

querydsl-jps:3.7.0

jackson-annotations:2.6.4

jackson-datatype-hibernate4:2.6.4

任何的想法 ?

如果它是一项功能,我想将其关闭…

回答:

除了MirMasej答案外,还有一件事:OpenEntityManagerInViewInterceptor当满足以下条件时,Spring

Boot将自动注册一个:

  • 您有一个Web应用程序
  • 您使用JPA

这两种情况在您的情况下都是正确的。该拦截器使实体管理器在请求的整个过程中保持打开状态。自动配置发生在类中JpaBaseConfiguration

如果您不希望这种行为,可以将以下属性添加到application.properties文件中:

spring.jpa.open-in-view=false

顺便说一句。这种行为完全独立于事务,仅与实体管理器的生命周期有关。如果两个事务都具有相同的基础实体管理器实例,那么您仍然可以有两个单独的事务,并且没有LazyInitializationException。

以上是 @RestController方法似乎默认情况下是事务性的,为什么? 的全部内容, 来源链接: utcz.com/qa/424707.html

回到顶部