使用 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)
}
是否可以有两个具有相同查询名称的用户对象图?
因为不同的视图需要不同的数据。
此外,当切换到新视图时(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
}
}
我有一个 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)
}
是否可以有两个具有相同查询名称的用户对象图? 因为不同的视图需要不同的数据。
此外,当切换到新视图时(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
}
}