gpt4 book ai didi

java - 使用 Spring 的具有不同 View 的 JPA EntityGraph

转载 作者:搜寻专家 更新时间:2023-10-31 20:01:26 26 4
gpt4 key购买 nike

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

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

好像我必须用不同的子实体调用 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. 是否可以有两个具有相同查询名称的用户对象图?因为不同的 View 需要不同的数据。

  2. 此外,当切换到新 View (在 spring Controller 中进行新调用)时,之前 View 中的事务将已经关闭,我必须进行新调用才能与用户获得不同的数据。如果您不使用相同的事务服务方法,我不明白 fetch lazy 有何帮助,除非我没有遗漏任何东西。

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

最佳答案

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

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

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

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

让您的存储库接口(interface)扩展该接口(interface)。

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
}
}

关于java - 使用 Spring 的具有不同 View 的 JPA EntityGraph,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31216971/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com