2

我在我的 Entity 类上定义了 JPA Entity Graph,如下所示。

用户表.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<>();

要求是有时我想连同照片一起获取用户,而在其他一些情况下,我只想从数据库中加载用户,而不是照片。

现在,我为 User - UserDAO.java创建了一个 DAO 类。在那里,我有两种方法,每种方法用于一种情况。

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());
}

我有点担心 DAO 层中的 API,因为它现在包含 2 个方法,例如findByEmailfindByEmailWithPhotos,它们也可以急切地加载照片。这是正确的方法吗?我们真的应该为每个定义的实体图使用一种 DAO 方法吗?某种建造者模式在这里会更有效吗?任何建议表示赞赏。

更新

为了进一步解释我觉得这个设计不好的地方如下。假设我们在用户上有 3 个实体图

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

那么在DAO中就需要有如下方法:

  1. 查找用户
  2. findUsersWithPhotos
  3. findUsersWithMessages
  4. findUsersWithFollowers
  5. findUsersWithPhotosAndMessages
  6. findUsersWithPhotosAndFollowers
  7. findUsersWithMessagesAndFollowers
  8. findUsersWithPhotosAndMessagesAndFollowers
4

0 回答 0