Dodawanie encji do bazy danych z dodanym już polem

Dodawanie encji do bazy danych z dodanym już polem
O1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 19
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ąć?

Kopiuj
@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.

AJ
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2
Charles_Ray
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1910
0

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

O1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 19
0

Item tworzę poprzez endpoint

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

O1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 19
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

vpiotr
  • Rejestracja: dni
  • Ostatnio: dni
0

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

Charles_Ray
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1910
0

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

O1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 19
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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.