В моем проекте мне нужно обновить сущность в базе данных (MySQL).Мой код выглядит так:
DAO:
public void updatepracownik (Pracownik pracus) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("baza");
EntityManager em = emf.createEntityManager();
EntityTransaction et = em.getTransaction();
et.begin();
Pracownik pp= (Pracownik)em.find(Pracownik.class ,1);
Query querys = em.createNativeQuery("UPDATE pracownik p SET p.idpracownik=?, p.imie=?, p.nazwisko=?, p.stanowisko=?, p.iloscGodzin=? WHERE p.idpracownik=idpracownik");
querys.setParameter(1, pracus.getIdpracownik());
querys.setParameter(2, pracus.getImie());
querys.setParameter(3, pracus.getNazwisko());
querys.setParameter(4, pracus.getStanowisko());
querys.setParameter(5, pracus.getiloscGodzin());
querys.executeUpdate();
em.persist(pracus);
et.commit();
}
Мой контроллер:
@Override
@Transactional
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
int idpracownik= Integer.valueOf(req.getParameter("idpracownik"));
String imie = req.getParameter("imie");
String nazwisko = req.getParameter("nazwisko");
String stanowisko = req.getParameter("stanowisko");
double iloscGodzin = Double.valueOf(req.getParameter("iloscGodzin"));
System.out.println(idpracownik);
Pracownik pracus= new Pracownik (idpracownik, imie, nazwisko, stanowisko, iloscGodzin);
Dao dao = new Dao();
dao.updatepracownik(pracus);
req.getRequestDispatcher("html/blank.jsp").forward(req,resp);
и, наконец, когда я хочу сделать обновление, я получаю сообщение об ошибке от MySQL:
Internal Exception: java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '142' for key 'PRIMARY'
Error Code: 1062
Call: UPDATE pracownik p SET p.idpracownik=?, p.imie=?, p.nazwisko=?, p.stanowisko=?, p.iloscGodzin=? WHERE p.idpracownik=idpracownik
bind => [5 parameters bound]
Query: DataModifyQuery(sql="UPDATE pracownik p SET p.idpracownik=?, p.imie=?, p.nazwisko=?, p.stanowisko=?, p.iloscGodzin=? WHERE p.idpracownik=idpracownik")
org.eclipse.persistence.internal.jpa.QueryImpl.executeUpdate(QueryImpl.java:308)
Я должен добавить - в моей таблице базы данных "idpracownik" установлен как AI и первичный ключ.Я знаю, что я не могу "обновить" PK, но когда я удаляю код (после слова SET):
p.idpracownik=?
из UPDATE pracownik p SET p.idpracownik=?
я получаю новую сущность с дублированными полями, нос новым (увеличенным) idpracownik ..... Я застрял в этом.