весенние данные JPA игнорируют fetchmode для методов запроса - PullRequest
0 голосов
/ 17 февраля 2019

У меня есть сущности, которые имеют переходные отношения.Таким образом, сущность A сопоставляется OneToMany с сущностью B, а сущность B сопоставляется OneToMany с сущностью C. У сущности A есть свойство userID, которое НЕ является первичным ключом, и мне нужно извлечь все записи для идентификатора пользователя из БД.Из-за требований я хочу охотно получать дочерние записи A и B.Я аннотировал сущности с помощью соединения FetchMode, и в моем репозитории есть метод findByUserId (int userId).Я использую пружинные данные JPA с Hibernate в качестве основного ORM.Выполнение вышеупомянутого метода запроса запускает несколько запросов, хотя я ожидал, что будет запущен только один запрос с объединением.

Я уже пробовал EntityGraphs, аннотировал свой метод репозитория с помощью NamedQuery, пробовал отображать сущности ManyToOne двунаправленный, но, похоже, ничего не происходитработает.

@Entity
@Table(name = "A_Master")
public class EntityA{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    private int userId;

    @OneToMany(cascade = CascadeType.PERSIST)
    @JoinColumn(name = "FK_reservationId")
    @Fetch(FetchMode.JOIN)
    private List<EntityB> bEntities= new ArrayList<>();

}

@Entity
@Table(name = "Entity_B")
public class EntityB{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;
    @OneToMany(cascade = CascadeType.PERSIST)
    @JoinColumn(name = "FK_journeyId")
    @Fetch(FetchMode.JOIN)
    private List<EntityC> cEntities = new ArrayList<>();
}

public interface ReservationRepository extends JpaRepository<EntityA, Integer>
{
    public List<EntityA> findByUserIdAndStatus(String userId);
}

1 Ответ

0 голосов
/ 17 февраля 2019

FetchType определяет способ загрузки коллекции.Будет ли он загружен немедленно или будет загружаться лениво (по требованию).

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

@OneToMany(cascade = CascadeType.PERSIST)
@Fetch(FetchMode.JOIN)

Это нонсенс , потому что по умолчанию fetchType OneToMany ленив, но вы не можете использовать механику JOIN на ленивыхколлекция.Чтобы иметь JOIN, вам нужно установить его в EAGER.

FetchMode по умолчанию в hibernate - это SELECT, и это предпочтительный режим извлечения, потому что он очень эффективен в отношении использования кэша, когда доступ основан наключ.Я бы порекомендовал вам использовать FetchType.Lazy с FetchMode.SELECT и с возможностью пакетного сбора .

...