Spring Boot Rest Relationships

nfweld

Mitglied
Guten Mittag,

ich hoffe ihr könnt mir weiter helfen! Zur Zeit bin ich in der Einarbeitung von Spring Boot und versuche Daten über ein Rest Interface einem Client zur Verfügung zu stellen. Speziell bin ich auf der Suche nach einem "Best Practice" das Einfügen von Inhalten in Entities mit Abhängigkeiten. Ich habe eine Entity A, die in einer bidirektionalen "OneToMany" relation auf einer andere Entity B verweist und dabei die Eigenschaft "NotNull" hat.

Java:
@Entity
public class A implements Serializable {

    @Id
    @Column(unique = true, nullable = false)
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int idA;

    private String valueA;

    @OneToMany(mappedBy = "a", fetch = FetchType.EAGER)
    private List<B> b;

    public A(){};
    public A(String valueA, B b){
        this.vaueA = valueA;
        this.b = new ArrayList();
        this.b.add(b);
}

Java:
@Entity
public class B implements Serializable {

    @Id
    @Column(unique = true, nullable = false)
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int idB;

    private String valueB;

    @ManyToOne
    @NotNull
    @JoinColumn(name = "A_IDA")
    private A a;

    public B(){};
    public B(String valueB, A a){
        this.vaueB = valueB;
        this.a = new ArrayList();
        this.a.add(a);
}

Dazu zwei Standard "CRUD-Repositories" und ein "RestController"

Java:
@RestController
@RequestMapping("/api")
public class WeldingController {

    @Autowired
    ARepository aRepository;
    @Autowired
    BRepository bRepository;
   

    @RequestMapping(method = RequestMethod.POST, value = "/a/")
    public ResponseEntity<?> addA(@RequestBody A a) {
        return new ResponseEntity<>(aRepository.save(a), HttpStatus.CREATED);
    }
   
    @RequestMapping(method = RequestMethod.POST, value = "/b/")
    public ResponseEntity<?> addB(@RequestBody B b) {
        return new ResponseEntity<>(bRepository.save(b), HttpStatus.CREATED);
    }
}

Gerne würde ich jetzt einen neuen Eintrag für A hinzufügen mit:
Code:
{
    "b":{
        "valueB":"test1234",
        "a:":{
            "valueA":"test5678"
        }
    }
}
dabei bekomme ich aber den Fehler, dass a nicht erstellt werden konnte.

Mich würde interessieren, wie normalerweise eine normalisierte Tabelle mit Relationships über die Rest Schnittstelle befüllt wird.

Wenn ich mein Problem noch nicht richtig erklärt habe, versuche ich es gerne nochmal auf eine andere Art.

Gruß nfweld
 
Das ist aber echt die schlechteste Werbung seit langem....


dabei bekomme ich aber den Fehler, dass a nicht erstellt werden konnte.
Wie sieht denn der Fehler aus? Die Exception dürfte den genauen Grund enthalten...

Auf den ersten Blick sieht aber zumindest das JSON-Objekt falsch aus. Das b in deiner Klasse ist eine Liste, in dem JSON aber ein Objekt...
Außerdem müssen in deiner Struktur A und B getrennt erstellt werden.


Mich würde interessieren, wie normalerweise eine normalisierte Tabelle mit Relationships über die Rest Schnittstelle befüllt wird.
Ich persönlich versuche Bi-Direktionale Verbindungen zu vermeiden (angelehnt an "Domain Driven Design") (zumindest als schreibend benutzbare, lesend kann man die durchaus haben). Einer der beiden ist dann der, dem die Verbindung gehört, und der kümmert sich um das anlegen des anderen.

In dem Fall würde es vermutlich auf entweder 'A anlegen, und dem dann B's hinzufügen' oder 'B mit einem enthaltenem A anlegen' hinauslaufen, welches genau hängt von der Domäne ab.
 

Zurück
Oben