данные весны jpa findAll может быть вызван на ассоциированную сущность OneToOne Mapping - PullRequest
0 голосов
/ 30 марта 2020

У меня есть два класса сущностей, как показано ниже, и соответствующий интерфейс репозитория

Объект 1

@Data
@NoArgsConstructor
@Entity
@Table(name = "person_details")
public class PersonDetails {
    @Id
    private String pid;

    @Column(name = "first_name")
    private String firstName;

    @Column(name = "last_name")
    private String lastName;

    @Column(name = "exist_flag")
    private String existFlag;

    @OneToOne(mappedBy = "personDetails", cascade = CascadeType.ALL)
    private AddressDetails addressDetails;
}

Объект 2

@Data
@NoArgsConstructor
@Entity
@Table(name = "address_details")
public class AddressDetails {
    @Id
    private String pid;

    private String street;

    @Column(name = "address_exist_flag")
    private String addressExistFlag;

    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinColumn(name = "pid", insertable = false, updatable = false)
    private PersonDetails personDetails;

}

Соответствующие интерфейсы репозитория

public interface PersonDetailsRepository extends JpaRepository<PersonDetails, String> {

}

public interface AddressDetailsRepository extends JpaRepository<AddressDetails, String> {

}

Если я вызываю findAll для экземпляра PersonDetailsRepository, я должен получить подробную информацию о и PersonDetails, и AddressDetails , которые я получаю с текущей реализацией.

Если я вызываю findAll в экземпляре AddressDetailsRepository, я должен получить детали только AddressDetails , которые я не получаю с текущей реализацией. Как я могу добиться этого, не влияя на findAll для экземпляра PersonDetailsRepository?

1 Ответ

0 голосов
/ 30 марта 2020

По умолчанию в режиме гибернации лениво загружается только одно отношение ко многим. Даже если мы дадим команду hibernate на ленивую загрузку, hibernate игнорирует этот намек. Чтобы преодолеть эту проблему, нам нужно включить улучшение байт-кода.

Улучшение байт-кода

Плагин улучшения байт-кода, который расширяет байт-код классов сущностей и позволяет нам использовать No-proxy Стратегия ленивого извлечения. Мы можем определить плагин в файле pom. xml следующим образом

<build>
<plugins>
    <plugin>
        <groupId>org.hibernate.orm.tooling</groupId
        <artifactId>hibernate-enhance-maven-plugin</artifactId>
        <version>5.4.2.Final</version>
        <executions>
        <execution>
        <configuration>           <enableLazyInitialization>true</enableLazyInitialization>                 </configuration>
        <goals>
            <goal>enhance</goal>
        </goals>
        </execution>
        </executions>
    </plugin>
</plugins>
</build>

Включение прокси-ленивых ассоциаций Теперь нам нужно добавить аннотацию @LazyToOne в классы сущностей, чтобы сообщить hibernate о том, что мы хотим включить ленивую выборку прокси для связанных сущностей.

    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @LazyToOne(LazyToOneOption.NO_PROXY)
    @JoinColumn(name = "pid", insertable = false, updatable = false)
    private PersonDetails personDetails;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...