首页 > 解决方案 > entityManager.remove(class) 不起作用

问题描述

我在一个名为 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 并使用这个删除方法,但没有删除该行

 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> ");

你们知道我该怎么做才能删除一行吗?

标签: javajpaservlets

解决方案


  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)只需在表中插入一个新行。然后删除新行。所以旧行仍然存在于表中。


推荐阅读