使用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 但这里它是成功的并触发选择作者。 所以方法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
任何想法?
如果是功能,我想将其关闭......
答案 0 :(得分:13)
除了MirMasej的答案之外,还有一件事:当满足以下条件时,Spring Boot会自动注册OpenEntityManagerInViewInterceptor
:
在您的情况下,这两个条件都是正确的。此拦截器使实体管理器在整个请求期间保持打开状态。自动配置发生在类JpaBaseConfiguration
中。
如果您不想要这种行为,可以将以下属性添加到application.properties文件中:
spring.jpa.open-in-view=false
顺便说一下。此行为完全独立于事务,它只与实体管理器的生命周期相关。如果两个事务具有相同的基础实体管理器实例,您仍然可以有两个单独的事务而没有LazyInitializationException。
答案 1 :(得分:0)
总是急切地想要一对一的关系。通过方法名称book.getAuthor().getFirstname()
来判断,book-> author和author-> firstName就是这样的关系。
只有懒惰的集合才会出现LazyInitializationException
。