2016-12-28 2 views
1

Я только что начал использовать Hibernate в своем приложении. Также я использую репозиторий JPA для использования пользовательского запроса. У меня есть несколько объектов, которые имеют отношения между ними. Я использовал режим Fetch как «EAGER» в столбце join, а также с помощью Cache. Я заметил, что Hibernate делает несколько выборочных запросов для получения каждого объекта и не делает его в одном запросе.Hibernate: несколько запросов на выбор, сделанных с помощью режима Hibernate for Fetch. Eager

Ниже сущность:

@Entity 
@Table(name = "entity_a") 
public class EntityA implements Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    ... 

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "entity_a") 
    @JsonIgnore 
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) 
    private Set<EntityB> entityB = new HashSet<>(); 

Я выборка моего лица, как показано ниже, используя JPA пользовательские запросы:

EntityA entityA = entityARepository.findOneById(id); 

Hibernate выдает запрос на выборку для вышеуказанного заявления.

Всякий раз, когда я делаю entityA.getEntityB(), он выдает другой оператор select на EntityB. Как этого избежать. Как я могу получить оба объекта в одном элементе, используя Hibernate?

ответ

0

EntityB содержит поле с именем entity_a? Имя должно быть точно таким же, как указано в атрибуте mappedBy.

В общем, провайдеры JPA обязаны соблюдать режим FetchType.EAGER. Кажется, это проблема неправильной конфигурации. Несмотря на это, в то время как провайдер JPA должен с нетерпением загружать нетерпеливые ассоциации, нет никакой гарантии, что это будет сделано в одном запросе. Существует аннотация Hibernate-specific, которая может использоваться как подсказка: @Fetch(FetchMode.JOIN). Попробуйте и посмотрите, работает ли это.

+0

Спасибо! Использование аннотации Fetch сработало для меня. –

Смежные вопросы