我有一个 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)
}
是否可以有两个具有相同查询名称的 User 对象图?
因为不同的视图需要不同的数据。
另外,当切换到新视图(弹簧控制器中的新调用)时,先前视图中的事务将已经关闭,我必须进行新调用以与用户获取不同的数据。如果您不在同一事务服务方法中,我不明白 fetch Lazy 有何帮助,除非我没有遗漏某些内容。
例如,如果我需要“orderWiew.html”中的订单数据,订单的延迟加载不会有帮助,我必须再次完全调用相同的用户数据和附加订单数据
只是关于使用多个实体图的建议:在我工作的地方,我们使用了 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
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)