【问题标题】:Update entity (JPA+MySQL) - Duplicate entry '142' for key 'PRIMARY'更新实体 (JPA+MySQL) - 键 'PRIMARY' 的重复条目 '142'
【发布时间】:2018-09-23 00:41:39
【问题描述】:

在我的项目中,我需要更新数据库 (MySQL) 中的实体。所以我的代码看起来像:

道:

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 的新实体..... 我陷入了困境。

【问题讨论】:

    标签: java mysql jpa


    【解决方案1】:

    应该在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 获取现有实例。您似乎将原始数据库操作与您的实体管理器提供的任何服务混为一谈。

    【讨论】:

    • 它不工作。我已经像你写的那样更改了代码,现在当我编辑时,我得到了具有其他 ID 的重复行:146 Ernest Pajak Manager 0.0 147 Ernest Nowak Manager 0.0
    • 如果您得到具有另一个 id 的重复行,那么您的代码会在其他地方执行插入操作。更新无法在数据库中创建新记录。
    • 你确定吗?我创建了新的 DAO 类,它只有 1 个方法(更新查询),它仍然是相同的结果(重复的行)。我在更新方法中检查“idpracownik”(通过 System.out.println),该值与编辑后的 ​​etnity 相同,所以我确定我正在编辑我想要的行。
    • 是的,我很确定。您创建一个新实体,然后将其持久化 - 这会导致插入操作。
    • 我爱你
    猜你喜欢
    • 2016-10-25
    • 2015-09-13
    • 1970-01-01
    • 2019-04-04
    • 2012-08-18
    • 2012-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多