使用JPA Hibernate实体LAZY和EAGER定义Rest-API[英] Define a Rest API with JPA Hibernate Entities - LAZY and EAGER

问题描述

如何定义用于获取JPA实体特定关系的RESTFUL WEB服务API的最佳方法?

示例:

如果A具有具有侵略角色(1-N关系)的资源用户

我希望有时会致电我的资源getuserbyname(我不想带来关系)和getuserbynamewithroles(在这里我想要驱逐双网络旅行的关系)

如何使用java休息获得最佳方法?

@Path("/user")
class UserResource{

  @GET
  @Path("/{name}")
  public Response getUserByName(@PathParam("name") String name){
    // hibernate query: select u from User u where u.name = :name
  }

  @GET
  // How I map this URL?
  @Path("/{name}") 
  public Response getUserByNameWithRoles(@PathParam("name") String name){
    // hibernate query: select u from User u inner join fetch u.roles where u.name = :name
  }

}

1)有2种方法吗?

2)使用@queryparam使用一些"展开"技巧

你们如何解决这个问题?

推荐答案

使用查询参数

您可以使用一个支持查询参数的单一方法,使您有可能加载角色:

@GET
@Path("/{name}")
@Produces("application/json")
public Response getUserByName(@PathParam("name") String name,
                              @QueryParam("load-roles") boolean loadRoles) {
    ...
}

使用子资源

另外,您可以拥有一个端点,该端点仅返回用户的表示形式和另一个端点,该端点仅返回用户角色的表示:

@GET
@Path("/{name}")
@Produces("application/json")
public Response getUserByName(@PathParam("name") String name) {
    ...
}

@GET
@Path("/{name}/roles")
@Produces("application/json")
public Response getRolesFromUserByName(@PathParam("name") String name) {
    ...
}

当需要角色时,只需执行第二个端点的请求以返回角色.

使用自定义媒体类型

另外,您可以拥有资源的完整表示的自定义媒体类型,以及部分表示的自定义媒体类型..

使用这种方法,您将拥有以下方法:

@GET
@Path("/{name}")
@Produces({ "application/json", "application/vnd.company.partial+json" })
public Response getUserByName(@PathParam("name") String name) {
    ...
}

@GET
@Path("/{name}")
@Produces("application/vnd.company.full+json")
public Response getUserByNameWithRoles(@PathParam("name") String name) {
    ...
}

要请求部分代表您的资源,请求就像:

GET /api/users/johndoe HTTP/1.1
Host: example.com
Accept: application/json
GET /api/users/johndoe HTTP/1.1
Host: example.com
Accept: application/vnd.company.partial+json

要请求您的资源的完整表示,请求就像:

GET /api/users/johndoe HTTP/1.1
Host: example.com
Accept: application/vnd.company.full+json

其他推荐答案

只需定义您的各种端点,然后致电您的服务或存储库类即可在根实体上执行适当的查询,以指定是否加载角色关系.

@Path("/{name}/withRoles")
public Response getUserByNameWithRoles(@PathParam("name") string name) {
  User user = userRepository.findByNameWithRoles( name );
  // translate your User to the response here.
}

@Path("/{name}")
public Response getUserByName(@PathParam("name") string name) {
  User user = userRepository.findByName( name );
  // translate your User to the response here.
}

在一天结束时,无论您是否使用框架X与框架y,概念和想法都保持直率和一致.

您也提到,您可以使用@queryparam传递标志,以指示是否也没有角色填充User.

本文地址:https://www.itbaoku.cn/post/978673.html