Jeśli chcesz automatycznie wygenerować id , to nie podawaj, nawet jeśli jest null . Usuń więc id z addProduect metoda:
@Override
public void addProduct(String description, double price, Date date) {
jdbcTemplate.update("INSERT INTO products values(?, ?, ?)", description, price, date);
}
Ponadto zrób swój id pole auto-increment , jak w tym pytanie
.
Lub zmień addProduct metody i użyj EntityManager#persist metoda:
@Override
public void addProduct(Product product) {
entityManager.persist(product);
}
O błędzie:
Ponieważ Twój formularz nie przyjmuje id wartość od klienta, /newproduct punkt końcowy miałby Product z null jako jego id wartość:
@RequestMapping(value = "/newproduct", method = RequestMethod.POST)
public ModelAndView submitForm(@ModelAttribute("product") Product product) { ... }
Następnie przekazujesz to null wartość jako parametr addProduct metoda:
prDao.addProduct(product.getId(), ...)
I wreszcie addProduct spróbuje zapisać to null wartość jako wartość klucza podstawowego , który ma Niepusty ograniczenie, więc masz ten błąd.
Również za pomocą Entity obiekty jako środek komunikacji z klientem, m.in. Product , nie jest dobrą praktyką. Spróbuj zdefiniować pewne abstrakcje pomocnicze, takie jak formularze lub DTO, i użyj ich do obsługi formularzy lub asemblacji odpowiedzi.