entityManager.remove(class)无法正常工作

时间:2018-09-28 07:25:49

标签: java jpa servlets

我在名为Utilidades的公共类下获得了此方法:

  public void delete(TipoUsuario tipoUsuario) throws Exception {
        if (em != null && tipoUsuario != null) {
            try {
                System.out.println("NO SON NULOS");
                // TipoUsuario p = em.find(TipoUsuario.class, tipoUsuario);
              em.getTransaction().begin();
//                Query query = em.createQuery("DELETE FROM TipoUsuario t WHERE t.idTipoUsuario = :idTipoUsuario");
//                query.setParameter("idTipoUsuario", tipoUsuario.getIdTipoUsuario());
//                int rows = query.executeUpdate();

               // if (em.contains(tipoUsuario)) {
                  //  em.remove(tipoUsuario);
               // } else {
                    em.remove(em.merge(tipoUsuario));
               em.getTransaction().commit();
             //   }

            } catch (EntityNotFoundException enfe) {
                Logger.getLogger(Utilidades.class.getName()).log(Level.SEVERE, enfe.getMessage(), enfe);
                em.getTransaction().rollback();
            }
        } else {
              System.out.println("NULOS");
        }
    }

我将此类注入servlet中,并使用此delete方法,但未删除行

 String st = request.getParameter("txtIdUsuario").trim();
if (!(st == null || "".equals(st))) {
                    idUsuario = Integer.parseInt(st);
                }
                tipoUsuario.setIdTipoUsuario(idUsuario);
out.println("<h2>Se selecionó botón " + idUsuario + " eliminar</h2> ");
                        utilidades.delete(tipoUsuario);
                        out.println("<h2>Se selecionó botón eliminar</h2> ");

你们是否知道如何删除行?

1 个答案:

答案 0 :(得分:0)

  1. 通常,我们从db获取以确保实体存在。喜欢 FROM TipoUsuario WHERE NAME = :name;

    Query query = em.createNativeQuery("FROM TipoUsuario WHERE NAME = :name;", TipoUsuario.class)
            .setParameter("name", name);
    
    TipoUsuario tipoUsuario = null;
    
    try
    {
        tipoUsuario = (TipoUsuario) query.getSingleResult();
    }
    catch ( Exception e )
    {
        return null;
    }
    

确保NAME是表TipoUsuario的主键。 如果您具有TipoUsuario的ID,则可以通过以下方式获取实体 em.find(TipoUsuario.class, id);

  1. 无论如何,您都会得到想要的结果。那你就

em.remote(tipoUsuario);

对其进行远程控制。就是这样。

您遇到的问题是,您只设置了TipoUsuario对象的一个​​值,但表中的结果却不同。

因此em.merge(obj)仅在表中插入新行。然后删除新行。因此,表中仍然存在旧行。