2016-11-30 5 views
0

В настоящее время я создаю rest-api с Java-EE/Jax-RS/JPA. У меня уже есть рабочая база данных + модель базы данных и используется опция eclipse для создания jpa-сущностей из существующих таблиц. Я создал некоторые базовые службы, и теперь мне любопытно, имеет ли смысл использование jpa-ассоциаций для создания rest-api или нет, потому что иногда это приводит к большому фрагменту данных, которые становятся доступными. Я также не уверен, где отделять данные, которые подвергаются.Java Rest API - разделение ресурсов/данных с JPA

например:

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 или даже /folders/1/items. Я вижу следующие варианты:

1) использовать JPA-ассоциаций, но отмечают список элементов (внутри папки-класса) как JSON-игнорировали для /папок/1 и принудительно вывод элементов при вызове /folders/1/items.

2) писать запросы на мой собственный

в последнем случае я спрашиваю, моя самость «почему бы я даже использовать JPA вообще?»

В то время как я смущен этим, мне также может потребоваться сказать, что все мои таблицы имеют внешний ключ для идентификатора пользователя. Так что я обычно хочу только получить папки определенного пользователя (пользователя, который в настоящий момент вошел в систему), создав службу /users/1/folders и на этом этапе, где я могу отделить данные? Я мог бы обслуживать весь мой клиент из конечной точки /users/, которая привела бы к той же проблеме, что и выше. И теперь мы можем определенно говорить о большом фрагменте данных, которые могут быть раскрыты, в зависимости от того, сколько папок у пользователя есть и сколько элементов содержатся в папках.

{ 
    "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

Если вы используете jackson library, то можете указать @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