Я знаю, что этот вопрос задавался несколько раз, но я не смог найти четкого примера и ответа на эту тему (я также пробовал другие возможные решения).
Я использую Spring JPA
и Hibernate
и пытаюсь сделать ленивую выборку для отношения OneToONe. У меня есть 2 простых класса Entity, один класс Repository и использование базы данных h2 для отложенной загрузки объекта. Я попробовал инструментарий байт-кода времени сборки, чтобы добиться этого, и это мои уроки.
Класс A
@Entity
public class A {
private String name;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@OneToOne(optional = false, fetch = FetchType.LAZY, mappedBy = "a")
@LazyToOne(LazyToOneOption.NO_PROXY)
private B b;
}
Класс B
@Entity
public class B {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@OneToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "A_ID")
private A a;
}
Репозиторий
public interface ARepository extends JpaRepository<A, Long> {
A findByName(String name);
}
pom.xml средство улучшения байт-кода
<plugin>
<groupId>org.hibernate.orm.tooling</groupId>
<artifactId>hibernate-enhance-maven-plugin</artifactId>
<version>${hibernate.version}</version>
<executions>
<execution>
<configuration>
<failOnError>true</failOnError>
<enableLazyInitialization>true</enableLazyInitialization>
</configuration>
<goals>
<goal>enhance</goal>
</goals>
</execution>
</executions>
</plugin>
и, наконец, initdata.sql для базы данных h2
insert into a (name, id) values ('a', 1);
insert into b (a_id, id) values (1, 1);
Когда я вызываю метод findByName()
в тестовом классе, он все еще выполняет 2 запроса для A
и B
. Как я могу получить ленивый B
класс? Заранее спасибо.