12

Niedawno zacząłem korzystać z resursów danych wiosennych dla mojej aplikacji. Mam następujące podmioty WZP:OGŁASZANIE zagnieżdżonych obiektów przy użyciu spoczynkowych danych sprężynowych?

@Entity 
public class Super { 
    @Id 
    private long id; 

    @JoinTable 
    @OneToMany(cascade = CascadeType.ALL) 
    private List<Child> children; 
} 

----------------------------------------- 

@Entity 
public class Super2 { 
    @Id 
    private long id; 

    @JoinTable 
    @OneToMany(cascade = CascadeType.ALL) 
    private List<Child> children; 
} 

----------------------------------------- 

@Entity 
public class Child { 
    @Id 
    private long id; 

    @Column 
    private String childMetadata; 
} 

mogę myśleć z 2 metod zapisywania nowych instancji Super lub Super2:

  1. narazić @RestResource dla Child klasę -> Utwórz wszystkie instancje Child przed tworzenie instancji Super lub Super2 -> Przesyłaj adresy URL wszystkich instancji Child w polu danych o wartości Super lub Super2.
  2. Przepuścić szczegóły Child w ładowności Super lub Super2 bez narażania @RestResourceChild dla klasy i CascadeType.ALL zadba o stworzenie Child instancji.

Istnieją pewne plusy z obu metod:

  1. Przy opcji 1, pojawia się możliwość dodawania nowych Child obiektów Super lub Super2 tylko przez POST ing url nowej Child do http://<server>:<port>/super/1/children. Ale zdecydowanie tracę kaskadową funkcjonalność bazy danych, jeśli używam tej metody.
  2. Z opcją 2 otrzymuję wszystkie kaskadowe funkcje bazy danych, ale tracę elastyczność dodawania nowych instancji Child.

Czy jest coś, co całkowicie przegapiłem? Chcę korzystać z kaskadowej funkcjonalności bazy danych bez utraty elastyczności dodawania nowych dzieci w locie.

Dzięki za pomoc. :)

+3

Osobiście nie używać Spring- dane-odpoczynek. Z mojego doświadczenia wynika, że ​​działa całkiem dobrze podczas odczytu danych, o ile posiadasz tylko jeden widok (reprezentację JSON) dla każdej jednostki. Jednak pisanie danych jest często bardziej skomplikowane, ponieważ musisz zarządzać relacją, co często wymaga niestandardowego kodu. Również kiedy tworzysz jednostki z deserializacji JSON, musisz sporo wiedzieć o oderwanych jednostkach JPA, których większość programistów nie tworzy.Większość programistów lepiej byłoby napisać oddzielne DTO dla widoków JSON i napisać metodę usługi, aby utrzymać dane. –

Odpowiedz

1

Jest jeszcze trzecia rozwiązanie, które powinny pasować do ciebie:

  1. Przepuścić szczegóły dziecko w ładowności Super lub Super2 bez narażania @RestResource atrybutu "dzieci" z Super (i Super2).

Nadal można korzystać z /children, ale będzie można pobrać dzieci z super i zamieścić go!

Aby to zrobić, wystarczy zmienić Super (i Super2) klasę tak:

public class Super { 
    @Id 
    @GeneratedValue 
    private Long id; 

    @JoinTable 
    @OneToMany(cascade = CascadeType.ALL) 
    @RestResource(exported=false) 
    private List<Child> children; 

    ... 
} 

Następnie można POST na /supers:

{ 
    "children": [ 
     { 
      "childMetadata": "inner" 
     } 
    ] 
}