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

时间:2015-07-04 04:42:25

标签: java spring jpa spring-data

我有一个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. 是否可以有两个具有相同查询名称的User对象图? 因为我需要不同视图的不同数据。

  2. 此外,当切换到新视图(Spring控制器中的新调用)时,前一个视图中的事务将被关闭,我必须进行新调用以与用户拥有不同的数据。如果你不是同一个交易服务方法,我不明白fetch lazy是如何有用的,除非我没有遗漏任何东西。

  3. 例如,如果我需要&#34; orderWiew.html&#34;延迟加载订单不会有帮助我必须再次调用相同的用户数据和其他订单数据

1 个答案:

答案 0 :(得分:5)

仅仅是关于使用多个实体图的消息:在我工作的地方,我们使用了Spring Data可以为查询方法使用多个前缀的事实。我们设置了一个约定,即具有不同前缀的方法具有不同的实体图。因此,例如,findUserByEmail(String)可以使用比readUserByEmail(String)更懒的图。

不幸的是,我不认为Spring Data支持传递实体图以动态方式使用。但是,您可以实现它并将其添加到您的存储库中。要做到这一点,你应该:

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

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

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

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

创建一个在同一个包中实现自定义行为的类,后缀为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
    }
}