更新实体(JPA + MySQL)-键“ PRIMARY”的条目“ 142”重复

时间:2018-09-23 00:41:40

标签: java mysql jpa

在我的项目中,我需要更新数据库(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的新实体..... 我陷入了困境。

1 个答案:

答案 0 :(得分:0)

应在where子句中使用主键来标识要更新的特定记录:

  Query querys = em.createNativeQuery("UPDATE  pracownik p SET p.imie=?, p.nazwisko=?, p.stanowisko=?, p.iloscGodzin=?  WHERE p.idpracownik=?");



    querys.setParameter(5, pracus.getIdpracownik());
    querys.setParameter(1, pracus.getImie());
    querys.setParameter(2, pracus.getNazwisko());
    querys.setParameter(3, pracus.getStanowisko());
    querys.setParameter(4, pracus.getiloscGodzin());

更新:

您插入了一条新记录,因为您创建了一个新的Pracownik实例并将其持久化。您应该根据自己的ID获得一个现有实例。您似乎在将原始数据库操作与您的实体经理提供的任何服务混合在一起。