Spring MVC - MySQLIntegrityConstraintViolationException

0

Próbuje zapisać dane do bazy jednak mam problem z pewnym błędem. Szukałem już dużo w internecie i nie znalazłem rozwiązania. Mógłby ktoś pomóc mi go rozwiązać?

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`mydb`.`pozycja`, CONSTRAINT `fk_Pozycja_Zamowienie2` FOREIGN KEY (`Zamowienie_idZamowienie`) REFERENCES `zamowienie` (`idZamowienie`) ON DELETE NO ACTION ON UPDATE NO ACTION)

Tabela Pozycja:

 DROP TABLE IF EXISTS `pozycja`;
    /*!40101 SET @saved_cs_client     = @@character_set_client */;
    /*!40101 SET character_set_client = utf8 */;
    CREATE TABLE `pozycja` (

      `idPozycja` int(11) NOT NULL AUTO_INCREMENT,
      `Zamowienie_idZamowienie` int(11) NOT NULL,
      `Produkt_idProdukt` int(11) NOT NULL,
      PRIMARY KEY (`idPozycja`),
      KEY `fk_Pozycja_Zamowienie2_idx` (`Zamowienie_idZamowienie`),
      KEY `fk_Pozycja_Produkt1_idx` (`Produkt_idProdukt`),
      CONSTRAINT `fk_Pozycja_Produkt1` FOREIGN KEY (`Produkt_idProdukt`) REFERENCES `produkt` (`idProdukt`) ON DELETE NO ACTION ON UPDATE NO ACTION,
      CONSTRAINT `fk_Pozycja_Zamowienie2` FOREIGN KEY (`Zamowienie_idZamowienie`) REFERENCES `zamowienie` (`idZamowienie`) ON DELETE NO ACTION ON UPDATE NO ACTION
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    /*!40101 SET character_set_client = @saved_cs_client */;
Kod odpowiedzialny za zapis danych:
Set<Pozycja> products = new HashSet<>();
    if (order.getCart()!=null && order.getCart().getCartItems().size()>0) {
        for (Map.Entry<Integer, CartItem> entry : order.getCart().getCartItems().entrySet())
        {
            Pozycja pozycja = new Pozycja();
            pozycja.setProdukt_idProdukt(entry.getValue().getProduct().getIdProdukt());
            pozycja.setProdukt(entry.getValue().getProduct());
            products.add(pozycja);
        }
    }
    zamowienie.setPozycja(products);
    zamowienie.setKlient(klient);
    zamowienieRepository.save(zamowienie);

Encje:

 @Entity
    @Table(name="Klient")
    public class Klient implements Serializable {

        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private int idKlient;
        @OneToMany(mappedBy="klient", fetch = FetchType.EAGER, cascade=CascadeType.ALL)
        private Set <Zamowienie> zamowienie;



 @Entity
    @Table(name = "Zamowienie")
    public class Zamowienie implements Serializable {

        @Id
        @GeneratedValue(strategy=GenerationType.IDENTITY)
        private int idZamowienie;

        @ManyToOne(cascade=CascadeType.PERSIST)
        private Klient klient;

        @OneToMany(mappedBy="zamowienie", cascade=CascadeType.PERSIST)
        private Set <Pozycja> pozycja;


@Entity
@Table(name="Pozycja")
public class Pozycja implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int idPozycja;
    private int Produkt_idProdukt;
    private int Zamowienie_idZamowienie;
    @OneToOne
    @JoinColumn(name = "Produkt_idProdukt", insertable = false, updatable = false)
    private Product produkt;

    @ManyToOne
    @JoinColumn(name = "Zamowienie_idZamowienie", insertable = false, updatable = false)
    private Zamowienie zamowienie;

0

A ta encja była już w bazie? Bo masz Cascade.Persist tylko więc propagacja jest tylko jeśli tworzysz nowy obiekt i zapisujesz w bazie. Jeśli on juz w bazie był to robisz Merge i aplikacja protestuje bo nie może wykonać takiej operacji na zależnej encji.

0

Ok błąd zniknął ale tabela pozycja pozostaje pusta. Dlaczego?

0

Pokaż najpierw co zrobiłeś. Wlącz tez logowanie SQLa żeby widzieć co za zapytania lecą.

0

Wszystko o co pytam masz wyżej. Chodzi mi o to czy mogę zapisać Set<Pozycja> products w ten sposób zamowienie.setPozycja(products), czy muszę zdejmować element po elemencie z tego setu i go zapisywać, czy w ogóle aby zapisać taki set to muszę to zrobić przez encje pozycja.

0

Nie możesz tego zrobić przez encje pozycja bo sam dałeś sobie insertable = false, updatable = false ;]
Możesz zrobić tak jak napisałeś, o ile masz poporawnie ustawioną kaskadę dla encji Zamowienie.

I w ogóle czemu piszesz to z anonima? Juz ci sie znudziło konto? To wiesz, mogę zbanować...

0

Tej kaskady nie mam poprawnie bo nadal wywali mi błąd: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (mydb.pozycja, CONSTRAINT fk_Pozycja_Zamowienie2 FOREIGN KEY (Zamowienie_idZamowienie) REFERENCES zamowienie (idZamowienie) ON DELETE NO ACTION ON UPDATE NO ACTION)

0

Ok temat do zamknięcia. Udało mi się rozwiązać problem ;))

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