Automatyczne zapisywanie "dziecka" encji z wykorzystaniem Hibernate i SpringData

0

Mam mapowanie @OneToMany na Product.

 @OneToMany(cascade = CascadeType.PERSIST,mappedBy = "product")
   private List<Authors> authors;

Druga strona **Authors **

  @ManyToOne
    @JoinColumn(referencedColumnName = "product_id")
    private Product product;

Do tego wiadomo id.
By dane zapisały sie prawidłowo z Jsona:

{
  "authors": [
    {
      "age": 0
    }
  ],
  "country": "string",
  "name": "string"
}

Musze recznie to zrobic.
Czyli dla kazdego autora ustawiać ten sam produkt:

product.getAuthors().stream().forEach(authors -> authors.setProduct(product));

Ktos wie jak ominąć ręczne ustawienie za pomoca stremów, czemu bez tego forgein-key w Authors jest nullem?

1

1.Po pierwsze nie od tego są streamy żeby mutować
Angry reactions only. Jak chcesz robić takie coś to używaj for each zwykłego
2.Powiazujesz autora z produktem już istniejącym?
No to musisz przekazać referencje to encji produktu żeby Hibernate wiedział jaki jest product_id
3.Encje JPA nie powinny być w API kontrolerów :(

0

1.Ten konkretny przykład jest zły ogołnie, ale pomijając go. Co złego jest w mutowaniu streamow, jeżeli wcześniej lista zostanie zmapowana do nowego wyrażenia.
Np:

 List<SampleDTO> output = 
    list.stream()
        .map(s-> {
                     SampleDTO n = new SampleDTO(s); // create new instance
                     n.setText(n.getText()+"xxx"); // mutate its state
                     return n; // return mutated instance
   

2.Za jednym zamachem wysyłam Produkt i autorów do niego przypisanych.
Własnie chodzi o to, że referencje ustawiam ręcznie przez tego brzydkiego strema:

product.getAuthors().stream().forEach(authors -> authors.setProduct(product));

Chciałbym się dowiedzieć czemu tak jest, ze musze recznie, przecieaż ja już mu wysyłam gotowe dane, a on nie potrafi wziać sam sobie klucza obcego.

  1. To laboratoryjny przykład w którym chciałem się skupić tylko na mapowaniu.
    Normalnie należałoby zwalidowac, jakieś serializowane dto i inne wygibasy.
0

Dobra nie zrozumiałem za pierwszym razem. Ty product zachowujesz wraz z listą autorów? Tak czy owak musisz powiazać dziecko z rodzicem przez zrobieniem save, tzn zrobić child.setParent(parentReference).

List<SampleDTO> output = 
    list.stream()
        .map(s-> {
                     SampleDTO n = new SampleDTO(s); // create new instance
                     n.setText(n.getText()+"xxx"); // mutate its state
                     return n; // return mutated instance

W powyższym przykładzie przeciez nie mutujesz zewnętrznego obiektu, tylko tworzysz nowy. Pomiając to że settery i mutowalne obiekty powinny być zniszczone, ale JPA więc ciężko inaczej :(

2

Chyba można ukryć metodę dostępową product.getAuthors() i zamiast orać na liście dodać do encji metodę `addAuthor(Author value) i tam w środku zrobić coś takiego:

void addAuthor(Author value) {
    value.setProduct(this);
    getAuthors().add(value);
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1