我在我的 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 个方法,例如findByEmail和findByEmailWithPhotos,它们也可以急切地加载照片。这是正确的方法吗?我们真的应该为每个定义的实体图使用一种 DAO 方法吗?某种建造者模式在这里会更有效吗?任何建议表示赞赏。
更新
为了进一步解释我觉得这个设计不好的地方如下。假设我们在用户上有 3 个实体图
user-graph-with-photos
user-graph-with-messages
user-graph-with-followers
那么在DAO中就需要有如下方法:
- 查找用户
- findUsersWithPhotos
- findUsersWithMessages
- findUsersWithFollowers
- findUsersWithPhotosAndMessages
- findUsersWithPhotosAndFollowers
- findUsersWithMessagesAndFollowers
- findUsersWithPhotosAndMessagesAndFollowers