2016-11-30 55 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