Я определил граф сущности 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 графа сущностей для пользователя
user-graph-with-photos
user-graph-with-messages
user-graph-with-followers
Тогдав DAO потребуется иметь следующие методы:
- findUsers
- findUsersWithPhotos
- findUsersWithMessages
- findUsersWithFollowers
- findUsersWithPhotosAndMessages1049 *
- findUsersWhotosPhotosAndFollowers
- findUsersWithMessagesAndFollowers
- findUsersWithPhotosAndMessagesAndFollowers