Dodawanie encji do bazy danych z dodanym już polem

0

Mam klasę Item w którego w skład wchodzi nazwa, cena i kategoria. Mam też encje kategoria (id, (unikalna) nazwa) którą już sobie powsadzałem do bazy danych. Teraz chcę dodać sobie item do bazy danych z zdefiniowaną kategorią, ale jej już nie dodawać - no bo już dodałem wcześniej, co najwyżej wskazać id tej kategorii w tabelce item. Jak to osiągnąć?

@Table
@Entity
public class Item {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;
    @Column
    private BigDecimal basicPrice;
    @ManyToOne(cascade = CascadeType.ALL)
    private Category category;
    @Column
    private String name;
    ....
}

@Entity
@Table(name = "category")
public class Category {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;

    @Column(unique = true)
    private String name;
  ....
}

Na obecną chwilę dostaję na twarz PSQLException informujący że duplikuję wartość name w kategorii przy próbie wsadzenia itema do bazy danych.

0

Kod wydaje się ok. Pokaż, w jaki sposób tworzysz ten Item (zakładam, że Category tworzysz przez new ;) )

0

Item tworzę poprzez endpoint

{
    "basicPrice": 200,
    "category": {
        "name": "programowanie w Java"
    },
    "name": "Książka o Javie"
}

    @Transactional
    @PostMapping(value = "add/", consumes = "application/json")
    public void add(@RequestBody Item item){
        itemRepositoryJpa.saveAndFlush(item);
    }

Zdaje się że program działa z CascadeType.REMOVE; gdy nie mam w tabeli kategorii "programowanie w Java" to dostaje exception, gdy mam to pokornie mi wstawia dane. Nie rozumiem tylko co to ma wspólnego z Remove. Ponadto mam troszkę bardziej rozbudowaną encje i zależności więc chwile mi zajmie przetestowanie całej aplikacji

0

Wyszło na to że w tej sytuacji w ogóle nie powinno być CascadeType, śmiga jak należy tylko szkoda że działa tylko wtedy gdy id kategorii to nazwa

0

Prawie identyczna relacja, sprawdź czy działa:
https://www.javatpoint.com/jpa-many-to-one-mapping

0

Aż oczy szczypią :) @Transactional na kontrolerze, encja na twarz i pchasz, flush() jest niepotrzebny :)

0

Oczy bolą bo najpierw sprawdzałem czy to co robię działa, dopiero po tym stworzyłem sobie kolejne abstrakcje, serwisy, dto itp.
@vpiotr; faktycznie w ten sposób trzeba to było napisać, mam to podobnie napisane

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