Hibernate Ленивая загрузка против явного запроса - PullRequest
0 голосов
/ 24 января 2019

У меня проблема с производительностью базы данных.

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

UserTable.java

@Id
@Column(name = "USER_ID", nullable = false)
private Long userId;

// other user fields

@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
private Set<ProfilePhotoTable> photos = new HashSet<>();

@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
private Set<AlbumPhotoTable> photos = new HashSet<>();

PhotoTable.java

@Id
@Column(name = "PHOTO_ID", nullable = false)
private Long photoId;

// other photo fields

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "USER_ID")
private UserTable user;

ProfilePhotoTable.java

@Entity
@Table(name = "PROFILEPHOTO")
@PrimaryKeyJoinColumn(name = "PROFILEPHOTO_ID", referencedColumnName = "PHOTO_ID")
public class ProfilePhotoTable extends PhotoTable

AlbumPhotoTable.java

@Entity
@Table(name = "ALBUMPHOTO")
@PrimaryKeyJoinColumn(name = "ALBUMPHOTO_ID", referencedColumnName = "PHOTO_ID")
public class ProfilePhotoTable extends PhotoTable

Теперь предположим, что я хочу написать запрос, который будет получать все фотографии для пользователя - все фотографии профиля и все фотографии альбома.

Однако я не хочу, чтобы фотографии были полученыкаждый раз, когда я запрашиваю информацию о пользователе из базы данных, и именно поэтому я указал fetch = FetchType.LAZY в полях фотографии.

В принципе, у меня есть сомнения между этими двумя подходами.

  1. Два независимых запроса, первый из которых извлекает UserTable из базы данных по идентификатору, а второй - фотографии, что-то вроде SELECT * FROM Photo WHERE userId = :userId.

  2. Один запрос join fetch для пользователя с соответствующими фотографиями.Тем не менее, я не совсем уверен, как этот запрос будет идти, так как фотографии разделены на альбом и фотографии профиля.Я обнаружил в этой статье что-то вроде

    comments = entityManager.createQuery (

    "select pc" + "из PostComment pc" + "join fetch pc.post"+ "где pc.review =: обзор", PostComment.class) .setParameter ("обзор", обзор) .getResultList ();

следует использовать, но я неуверен, как применить его к моему варианту использования.

Вопрос в том, какой подход лучше с точки зрения производительности, а если 2-й, как должен быть структурирован запрос?

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Если вы используете JPA 2.1 или выше, вы можете использовать @ NamedEntityGraph для управления, если вы хотите получить ваши данные "EAGER" или "LAZY".

В этой статье это объясняетсяочень хорошо: https://thoughts -on-java.org / jpa-21-entity-graph-part-1-named-entity /

0 голосов
/ 24 января 2019

Я думаю, что ответ будет зависеть от того, какая часть ваших пользовательских запросов также запрашивает фотографии.Если ответ - небольшая доля, то было бы разумно держать его ленивым, чтобы вам не приходилось тянуть их все время.В любом случае, я не буду хранить фотографии в традиционном типе реляционной базы данных.Я бы положил их в какое-то хранилище объектов и сохранял бы только идентификаторы с помощью RDBMS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...