Как работает FetchMode в Spring Data JPAJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Как работает FetchMode в Spring Data JPA

Сообщение Anonymous »

У меня есть связь между тремя объектами модели в моем проекте (фрагменты модели и репозитория в конце сообщения).

Когда я вызываю PlaceRepository.findById code> он запускает три запроса выбора:

("sql")
  • SELECT * FROM place p where id = arg
  • SELECT * FROM user u where u.id = place.user.id
  • SELECT * FROM city c LEFT OUTER JOIN state s on c.woj_id = s.id where c.id = place.city.id
Это довольно необычное поведение (для меня). Насколько я могу судить после прочтения документации Hibernate, он всегда должен использовать запросы JOIN. Никакой разницы в запросах при изменении FetchType.LAZY на FetchType.EAGER в классе Place (запрос с дополнительным SELECT), то же самое для класса City при FetchType.LAZY изменен на FetchType.EAGER (запрос с JOIN).

Когда я использую CityRepository.findById, подавление вызывает два выбора:
  • < ли>SELECT * FROM city c where id = arg
  • SELECT * FROM state s where id = city.state.id
Моя цель — добиться одинакового поведения во всех ситуациях (либо всегда JOIN, либо SELECT, хотя JOIN предпочтительнее) .

Определения модели:

Место:

@Entity
@Table(name = "place")
public class Place extends Identified {

@Fetch(FetchMode.JOIN)
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "id_user_author")
private User author;

@Fetch(FetchMode.JOIN)
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "area_city_id")
private City city;
//getters and setters
}


Город:

@Entity
@Table(name = "area_city")
public class City extends Identified {

@Fetch(FetchMode.JOIN)
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "area_woj_id")
private State state;
//getters and setters
}


Репозитории:

PlaceRepository

public interface PlaceRepository extends JpaRepository
, PlaceRepositoryCustom {
Place findById(int id);
}


Репозиторий пользователей:

public interface UserRepository extends JpaRepository {
List findAll();
User findById(int id);
}


CityRepository:

public interface CityRepository extends JpaRepository, CityRepositoryCustom {
City findById(int id);
}


Подробнее здесь: https://stackoverflow.com/questions/296 ... g-data-jpa
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Использование FetchMode.SELECT с FetchType.EAGER в Hibernate
    Гость » » в форуме JAVA
    0 Ответы
    33 Просмотры
    Последнее сообщение Гость
  • Как фильтровать выборку Hibernate? Spring Data JPA, отношение ManyToMany с новой сущностью, спецификации JPA
    Anonymous » » в форуме JAVA
    0 Ответы
    31 Просмотры
    Последнее сообщение Anonymous
  • Android Monhofit Post Type Data Data Wations Data Null Null
    Anonymous » » в форуме Android
    0 Ответы
    47 Просмотры
    Последнее сообщение Anonymous
  • Android Monhofit Post Type Data Data Wations Data Null Null
    Anonymous » » в форуме Android
    0 Ответы
    38 Просмотры
    Последнее сообщение Anonymous
  • Класс org.springframework.data.repository.query.DefaultParameters нельзя привести к классу org.springframework.data.jpa.
    Anonymous » » в форуме JAVA
    0 Ответы
    108 Просмотры
    Последнее сообщение Anonymous

Вернуться в «JAVA»