EntityManager.remove (class) не работает - PullRequest
0 голосов
/ 28 сентября 2018

Я получил этот метод в общедоступном классе с именем 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");
        }
    }

Я внедряю этот класс в сервлет и использую этот метод удаления, но не удаляю строку

 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 голосов
/ 28 сентября 2018
  1. Обычно мы выбираем из базы данных, чтобы убедиться, что сущность существует.Например, 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, вы можете извлечь объект по em.find(TipoUsuario.class, id);

В любом случае, вы получите желаемый результат.Затем вы делаете

em.remote(tipoUsuario);

для его удаленного доступа.Вот и все.

Ваша проблема существует в том, что вы просто устанавливаете одно значение объекта TipoUsuario, но это не тот же результат в таблице.

Так что em.merge(obj) просто вставляет новую строку вТаблица.Затем вы удалите новый ряд.Таким образом, старая строка все еще существует в таблице.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...