使用 Spring 具有不同视图的 JPA EntityGraph

JPA EntityGraph with different views using Spring

我有一个 Spring 应用程序。登录后,我正在调用 getUserByEmail() 方法。

我只需要用户和角色数据。根据角色,我将显示不同的视图,每个视图都有不同的数据,需要不同的用户子实体。

看来我必须用不同的子实体调用 getUserByEmail()。

这是我涉及实体的部分代码:

EntityGraph(value = "withAddresses", type = EntityGraphType.FETCH)
public class User{
  public firstName;
  public lastName;

  @OneToMany(fetch = FetchType.LAZY)
  public List<Address> addresses

  @OneToMany(fetch = FetchType.LAZY)
  public List<Order> orders;             
 }

 public userRepository extend jPaRepository(User.class,Long){
  @EntityGraph(name="withAdresses")
  getUserByEmail(String email)

  /* if possible */
  @EntityGraph(name="withOrder")
  getUserByEmail(String email)
 }
  1. 是否可以有两个具有相同查询名称的用户对象图? 因为不同的视图需要不同的数据。

  2. 此外,当切换到新视图时(spring 控制器中的新调用),之前视图中的事务将已经关闭,我必须进行新调用才能获得不同的数据用户。我不明白如果你不在同一个事务服务方法中,fetch lazy 有什么用,除非我没有遗漏什么。

例如,如果我需要 "orderWiew.html" 中的订单数据,延迟加载订单将无济于事,我必须再次完全调用相同的用户数据和其他订单数据

关于使用多个实体图的建议:在我工作的地方,我们使用了 Spring 数据可以使用多个前缀作为查询方法。我们设定了一个约定,不同前缀的方法有不同的实体图。因此,例如,findUserByEmail(String) 可以使用比 readUserByEmail(String) 更惰性的图。

不幸的是,我认为 Spring 数据不支持传递实体图以动态方式使用。不过,您可以实施它并将其添加到您的存储库中。为此,您应该:

创建一个声明新方法的接口(但不扩展 JpaRepository 或其他存储库接口)

public interface UserCustomOperations{
    User findUserByEmail(String email, String entityGraph);
}

使您的存储库接口扩展该接口。

public interface UserRepository extends JPaRepository<User,Long>, UserCustomOperations{
    // Not much to do here anymore
}

创建一个 class 在同一个包中实现您的自定义行为,后缀为 Impl(默认情况下)。

public class  UserRepositoryImpl implements UserCustomOperations{
    public User findUserByEmail(String email, String entityGraph){
        // Inject the EntityManager and execute standard Jpa query with the entity graph set
    }
}