Hibernate OneToONe Lazy Fetching - PullRequest
       22

Hibernate OneToONe Lazy Fetching

0 голосов
/ 10 сентября 2018

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

Я использую 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 класс? Заранее спасибо.

1 Ответ

0 голосов
/ 10 сентября 2018

Как я знаю, невозможно избежать 2 запросов, потому что Hibernate должен знать, что должно быть вставлено в ваше поле «один к одному» - прокси или ноль. Прокси вставляется в ваш объект, если есть связанная запись во вторичной таблице, NULL, если нет записей. Таким образом, Hibernate выполнить второй запрос, чтобы сделать проверку. Вставив «один к одному», вы можете использовать «многие к одному»

...