Использование JPA Entity Graph в DAO - PullRequest
0 голосов
/ 26 января 2019

Я определил граф сущности JPA в своем классе сущностей, и он выглядит следующим образом.

UserTable.java

@Entity
@Table(name = "USER")
@NamedEntityGraph(
        name = "user-entity-graph-with-photos", 
        attributeNodes = {
                @NamedAttributeNode(value = "photos"),
        })
public class UserTable {

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

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

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

Теперь я создал класс DAO для пользователя.- UserDAO.java .Там у меня есть два метода, каждый для одного случая.

public Optional<UserTable> findByEmail(String email) {
    final TypedQuery<UserTable> query = entityManager.createQuery(
            "SELECT e FROM UserTable e WHERE e.email = :email", UserTable.class);

    return Optional.ofNullable(query.setParameter("email", email).getSingleResult());
}

public Optional<UserTable> findByEmailWithPhotos(String email) {
    final TypedQuery<UserTable> query = entityManager.createQuery(
            "SELECT e FROM UserTable e WHERE e.email = :email", UserTable.class);

    return Optional.ofNullable(query
            .setParameter("email", email)
            .setHint("javax.persistence.loadgraph", entityManager.getEntityGraph("user-entity-graph-with-photos"))
            .getSingleResult());
}

Я немного обеспокоен API на уровне DAO, так как теперь он содержит 2 метода, таких как findByEmail и findByEmailWithPhotos , которая также загружает фотографии с нетерпением.Это правильный подход?Должны ли мы действительно использовать один метод DAO для каждого определенного графа сущностей?Будет ли какой-то шаблон строителя быть более эффективным здесь?Любой совет приветствуется.

ОБНОВЛЕНИЕ

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

  1. user-graph-with-photos
  2. user-graph-with-messages
  3. user-graph-with-followers

Тогдав DAO потребуется иметь следующие методы:

  1. findUsers
  2. findUsersWithPhotos
  3. findUsersWithMessages
  4. findUsersWithFollowers
  5. findUsersWithPhotosAndMessages1049 *
  6. findUsersWhotosPhotosAndFollowers
  7. findUsersWithMessagesAndFollowers
  8. findUsersWithPhotosAndMessagesAndFollowers
...