Relacja @ManyToOne nie zapisuje się do bazy danych

0
@Entity
public class Cart {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private BigDecimal subTotal;
    private String cartSessionId;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "cart")
    @Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE)
    private List<CartItem> cartItemList = new ArrayList<>();

@Entity
public class CartItem {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinTable(name = "cart_cartitem",
            joinColumns = @JoinColumn(name = "cart_id"),
            inverseJoinColumns = @JoinColumn(name = "cartitem_id"))
    @JsonIgnore
    private Cart cart;

    @ManyToOne(fetch = FetchType.LAZY)
    private Product product;
    private Integer quantity;
    private BigDecimal price;

Tak wyglądają moje klasy domenowe i sprawa wygląda tak, że wywołuję akcję: cartRepository.save(cart); i w tym momencie obiekt cart ma do ArrayList dodany obiekt CartItem - podejrzałem debuggerem. Czyli w momencie zapisywania mam relację:

Cart - CartItem

A do bazy zapisuje tylko Cart. Czyli mam 1 rekord w tabeli Cart i żadnego rekordu w CartItem. Dlaczego tak się dzieje ? @JsonIgnore ma z tym coś wspólnego ? Korzystam z klasy org.springframework.data.repository.CrudRepository.

0

Zostałeś zdradzony przedz mapedBy, które określa, że to pole cart w CartItem decyduje. A pewnie go nie ustawiasz.
Tu zobacz jak to poprawnie zrobić:
https://vladmihalcea.com/a-beginners-guide-to-jpa-and-hibernate-cascade-types/

0

Chodzi o to, żeby zamienić @Cascade(SAVE_UPDATE) na cascade = CascadeType.ALL w @OneToMany w klasie Cart ? Myślałem, że właśnie @Cascade odpowiada za zapisywanie drugiego uczestnika relacji do bazy.

0

Jeszcze raz: nie ustawiasz pola cart w CartItem (zgaduję) i dlatego masz problem. Cascade nic z tym nie robi.

0

Nie zgadłeś ; ) Pole cart w CartItem zostało ustawione jak należy przy tworzeniu CartItem. Tylko, że teraz moje pytanie wciąż jest bez odpowiedzi.

1

Jest odpowiedź. Zmienić CascadeType.SAVE_UPDATE na CascadeType.ALL. Chyba już sam sobie jej udzieliłeś.

0

W sumie tak zrobiłem już wcześniej i działało, po prostu zastanawiałem się czemu nie działa z CascadeType.SAVE_UPDATE, ale dobra, widocznie niedokładnie przeczytałem za co ona odpowiada.

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