Kotlin Hibernate OneToOne fetchtype.LAZY немедленно запускает все запросы

Я работаю над обучением, где тренер использует Java, и я использую Kotlin. До сих пор мы везде получали одни и те же результаты, но здесь я не могу заставить его работать.

Существует 2 класса сущностей:

@Entity data class Student( @Id @GeneratedValue var id: Long = 0, @Column(nullable = false) var name: String = "", @OneToOne() var passport: Passport? = null ) @Entity data class Passport( @Id @GeneratedValue var id: Long = 0, @Column(nullable = false) var number: String = "" ) 

И в тестовом классе я использую диспетчер сущностей для выполнения запроса.

 @RunWith(SpringRunner::class) @SpringBootTest class StudentRepositoryTest { val logger = LoggerFactory.getLogger(this.javaClass) @Autowired lateinit var studentRepository: StudentRepository @Autowired lateinit var entityManager: EntityManager @Test fun retrieveStudentAndPasswordDetails() { val student: Student? = entityManager.find(Student::class.java, 20001L) logger.info("Student -> $student") logger.info("Passport -> `${student?.passport}") } } 

Когда я запускаю тест таким образом, выход будет таким, как ожидалось

 Hibernate: select student0_.id as id1_3_0_, student0_.name as name2_3_0_, student0_.passport_id as passport3_3_0_, passport1_.id as id1_1_1_, passport1_.number as number2_1_1_ from student student0_ left outer join passport passport1_ on student0_.passport_id=passport1_.id where student0_.id=? 2017-12-29 20:51:04.258 TRACE 17233 --- [ main] ohtype.descriptor.sql.BasicBinder : binding parameter [1] as [BIGINT] - [20001] 2017-12-29 20:51:04.263 TRACE 17233 --- [ main] ohtype.descriptor.sql.BasicExtractor : extracted value ([id1_1_1_] : [BIGINT]) - [40001] 2017-12-29 20:51:04.265 TRACE 17233 --- [ main] ohtype.descriptor.sql.BasicExtractor : extracted value ([name2_3_0_] : [VARCHAR]) - [Ranga] 2017-12-29 20:51:04.266 TRACE 17233 --- [ main] ohtype.descriptor.sql.BasicExtractor : extracted value ([passport3_3_0_] : [BIGINT]) - [40001] 2017-12-29 20:51:04.267 TRACE 17233 --- [ main] ohtype.descriptor.sql.BasicExtractor : extracted value ([number2_1_1_] : [VARCHAR]) - [E123456] 2017-12-29 20:51:04.269 INFO 17233 --- [ main] i.StatisticalLoggingSessionEventListener : Session Metrics { 19949 nanoseconds spent acquiring 1 JDBC connections; 0 nanoseconds spent releasing 0 JDBC connections; 1097216 nanoseconds spent preparing 1 JDBC statements; 227119 nanoseconds spent executing 1 JDBC statements; 0 nanoseconds spent executing 0 JDBC batches; 0 nanoseconds spent performing 0 L2C puts; 0 nanoseconds spent performing 0 L2C hits; 0 nanoseconds spent performing 0 L2C misses; 0 nanoseconds spent executing 0 flushes (flushing a total of 0 entities and 0 collections); 0 nanoseconds spent executing 0 partial-flushes (flushing a total of 0 entities and 0 collections) } 2017-12-29 20:51:04.269 INFO 17233 --- [ main] cijhjrStudentRepositoryTest : Student -> Student(id=20001, name=Ranga, passport=Passport(id=40001, number=E123456)) 2017-12-29 20:51:04.269 INFO 17233 --- [ main] cijhjrStudentRepositoryTest : Passport -> `Passport(id=40001, number=E123456) 

Это выглядит очень хорошо. Запрос вызывается с соединением, и отображаются оба выхода журнала.

Использование FetchType.LAZY

Здесь я добавляю FetchType.LAZY в аннотацию OneToOne которая должна сделать поиск данных паспорта до тех пор, пока он не понадобится.

 @Entity data class Student( @Id @GeneratedValue var id: Long = 0, @Column(nullable = false) var name: String = "", @OneToOne(fetch = FetchType.LAZY) var passport: Passport? = null ) 

Здесь я вижу неожиданное поведение.

То, что я ожидаю, – это увидеть запрос для извлечения данных о студенте, а затем выводить выходные данные для данных учащихся. Следующий запрос для получения паспортных данных и, наконец, журнал для получения паспортных данных.

Когда ленивая загрузка была бы полностью проигнорирована, я бы ожидал увидеть соединение, но вместо этого есть два отдельных запроса, которые, похоже, ухудшают ситуацию, без ленивой загрузки.

 Hibernate: select student0_.id as id1_3_0_, student0_.name as name2_3_0_, student0_.passport_id as passport3_3_0_ from student student0_ where student0_.id=? 2017-12-29 21:03:53.401 TRACE 17380 --- [ main] ohtype.descriptor.sql.BasicBinder : binding parameter [1] as [BIGINT] - [20001] 2017-12-29 21:03:53.411 TRACE 17380 --- [ main] ohtype.descriptor.sql.BasicExtractor : extracted value ([name2_3_0_] : [VARCHAR]) - [Ranga] 2017-12-29 21:03:53.412 TRACE 17380 --- [ main] ohtype.descriptor.sql.BasicExtractor : extracted value ([passport3_3_0_] : [BIGINT]) - [40001] Hibernate: select passport0_.id as id1_1_0_, passport0_.number as number2_1_0_ from passport passport0_ where passport0_.id=? 2017-12-29 21:03:53.413 TRACE 17380 --- [ main] ohtype.descriptor.sql.BasicBinder : binding parameter [1] as [BIGINT] - [40001] 2017-12-29 21:03:53.415 TRACE 17380 --- [ main] ohtype.descriptor.sql.BasicExtractor : extracted value ([number2_1_0_] : [VARCHAR]) - [E123456] 2017-12-29 21:03:53.427 INFO 17380 --- [ main] i.StatisticalLoggingSessionEventListener : Session Metrics { 33422 nanoseconds spent acquiring 1 JDBC connections; 0 nanoseconds spent releasing 0 JDBC connections; 569626 nanoseconds spent preparing 2 JDBC statements; 1612599 nanoseconds spent executing 2 JDBC statements; 0 nanoseconds spent executing 0 JDBC batches; 0 nanoseconds spent performing 0 L2C puts; 0 nanoseconds spent performing 0 L2C hits; 0 nanoseconds spent performing 0 L2C misses; 0 nanoseconds spent executing 0 flushes (flushing a total of 0 entities and 0 collections); 0 nanoseconds spent executing 0 partial-flushes (flushing a total of 0 entities and 0 collections) } 2017-12-29 21:03:53.427 INFO 17380 --- [ main] cijhjrStudentRepositoryTest : Student -> Student(id=20001, name=Ranga, passport=Passport(id=40001, number=E123456)) 2017-12-29 21:03:53.427 INFO 17380 --- [ main] cijhjrStudentRepositoryTest : Passport -> `Passport(id=40001, number=E123456) 

Аннотации @Transactional

Что-то еще: когда тренер запускает тесты без @Transacional по методу тестирования, генерируется исключение.
В моем случае не имеет значения, использую ли я эту аннотацию или нет.