2016-11-30 32 views
0

我目前正在用Java-EE/Jax-RS/JPA构建rest-api。 我已经有一个工作数据库+数据库模型,并使用eclipse选项从现有表创建jpa实体。 我创建了一些基本的服务,现在我很好奇,使用jpa-association是否对构建rest-api有意义,因为它有时会导致大量数据暴露。我也不确定在哪里分离正在暴露的数据。Java Rest API - 使用JPA的资源/数据分离

E.g:

table "FOLDER" has an id, name 
table "FOLDER_ITEM" has an id, folder_id (fk), item_id (fk) 
table "ITEM" has an id, name, itemprop_id(fk) 
table "ITEM_PROP" has an id, valueA, valueB, valueC 

调用/文件夹/ 1目前输出:

{ 
    "id": 1, 
    "name": "Folder1", 
    "items": [ 
    { 
     "id": 1, 
     "name": "pencil", 
     "item_prop": { 
     "id": "1", 
     "valueA": "example", 
     "valueB": "example", 
     "valueC": "example" 
     } 
    },...] 
} 

如果有很多连接到文件夹的项目,其加起来大量的数据。

所以我认为通过创建服务来分开数据可能更简单,更清洁/items/{id}一次只能给我一个项目。 但在这种情况下,我还必须创建一个服务来获取文件夹的项目。例如/items /?withFolderId = 1 或甚至/文件夹/ 1 /项目。我看到如下选项:

1)使用JPA的协会,但标记项目的列表(文件夹类中)为JSON-忽略/文件夹/ 1,并迫使项目的输出调用当/ folders/1/items

2)写我自己的查询

在后者的情况下,我问我自己“为什么我甚至使用JPA呢?”

虽然beeing由此我可能也不得不说,我所有的表都有一个用户id的外键。 因此,我通常只想通过创建服务/users/1/folders来获取特定用户(当前登录的用户)的文件夹,并且此时我会将数据分开吗? 我可以服务我的整个客户端端点,这将导致与上述相同的问题。现在我们可以肯定地谈论一大堆暴露的数据,这取决于用户拥有多少文件夹以及文件夹包含多少项目。

{ 
    "id":1 
    "name":"testuser" 
    "password":"PW" 
    "folders": 
    [{ 
     "id": 1, 
     "name": "Folder1", 
     "items": [ 
     { 
      "id": 1, 
      "name": "pencil", 
      "item_prop": { 
      "id": "1", 
      "valueA": "example", 
      "valueB": "example", 
      "valueC": "example" 
      } 
     },....] 
    },....] 
} 

我觉得我很担心这个问题。有没有任何建议或常见的方法来解决这个问题?

回答

0

如果您使用杰克逊库,那么您可以提及@JsonIgnore以避免json响应。遵循示例代码。

@Entity 
@Table(name="address") 
@EqualsAndHashCode(exclude={"id","companies","clientDetails"}) 
@Getter 
@Setter 
@NoArgsConstructor 
@ToString(exclude = {"companies","clientDetails"}) 
@JsonIgnoreProperties(ignoreUnknown = true) 
public class Address implements Serializable { 
private static final long serialVersionUID = 1L; 

@Id 
@GeneratedValue(strategy=GenerationType.IDENTITY) 
@Column(unique=true, nullable=false) 
private Integer id; 

@Column(name="address_line1") 
private String addressLine1; 

@Column(name="address_line2") 
private String addressLine2; 

@Column 
private String city; 

@Column 
private String country; 

@Column(name="phone_no") 
private String phoneNo; 

@Column(name="postal_code") 
private String postalCode; 

@Column 
private String state; 

//bi-directional many-to-one association to ClientDetail 
@OneToMany(mappedBy="addressBean",fetch=FetchType.LAZY) 
@JsonIgnore 
private Set<ClientDetail> clientDetails; 

//bi-directional many-to-one association to Company 
@OneToMany(mappedBy="address", fetch=FetchType.LAZY) 
@JsonIgnore 
private Set<Company> companies; 
} 
+0

感谢您指出:)在过去的几个小时里,我只是自己想出了这件事。剩下的唯一问题就是在哪里分离数据,但我想这个应用程序不同。 – LLLen