Java - невозможно установить значение в таблице базы данных, чтобы отразить изменения - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть простая веб-страница, на которой я могу щелкнуть раскрывающееся меню и выбрать понравившуюся версию документа. Каждая версия документа имеет свой собственный статус файла, представленный Активно (1) или Устаревшее (2) .

Поэтому, если я перейду на любую версию документа, я смогу просмотреть детали этого документа. А рядом с документом есть кнопка «Редактировать», которая будет отображаться в зависимости от состояния файла версии.

Только один файл может быть активным одновременно.Так что если есть две версии, версия A и версия B, где A активен, то B должен быть устаревшим. Если я перехожу на просмотр версии B (с помощью раскрывающегося списка), кнопка Edit не должна отображаться.

Inмой БД, у меня есть столбец с именем fstatus, представленный int.Когда он извлекает версию документа, он проверяет значение этого столбца.Если значение равно 1, отобразите кнопку «Редактировать», в противном случае кнопка не будет отображаться.

Моя проблема в том, что при переходе на неактивную версию я хочу установить значение, отличное от 1, чтобы оно автоматическиудаляет кнопкуКажется, я не могу заставить его работать, поэтому мне нужно знать, что я делаю неправильно.

Fmedia.java : есть метод получения и установки, который извлекает и устанавливает значение длястолбец в таблице

 public int getFstatus() {
        return fstatus;
    }

    public void setFstatus(int fstatus) {
        this.fstatus = fstatus;
    }

File.java :

    public Node get_folder(long fileID) {
     //this line is not that important
   List resList1 = nodeFacade.list_parent(fileID, LinkType.VER_LINKS);

       // This retrieves version document that are inactive
       if(resList1.size()==1){
          // grabs the unique fileID so it knows which row in the table to update the column status
          Fmedia fmedia = new Fmedia(fileID);
          //set the status column to 2 (initially it's 1)
          fmedia.setFstatus(2);
          // by changing the value to 2 before retrieving the record,it should  be able to retrieve the record now and not display the button.
          // returns the records of that inactive version.
          return (Node) resList1.get(0);
        }


    }

Я подозреваю, что проблема заключается в строке fmedia.setFstatus(2);, потому что мне действительно нужно обновить записьот 1 до 2, и это существующая запись в таблице.Кроме того, я запустил отладку, и он смог получить правильный идентификатор файла, но каким-то образом он не может обновить столбец состояния, то есть все равно 1, что мне не нужно.

Есть ли способ преодолеть эту проблему

1 Ответ

0 голосов
/ 13 февраля 2019

Когда вы создаете:

Fmedia fmedia = new Fmedia(fileID);
fmedia.setFstatus(2);

Создает объект и присваивает значение статусу, НО НЕ сохранит / не сохранит данные в базе данных.

Вам необходимо косвенно вызватьчтобы убедиться, что EntityManager сохранит данные.

Поскольку вы используете:

<groupId>com.htasia</groupId>
<artifactId>PantonMCRE</artifactId>
<version>9.5.0</version>

https://docs.oracle.com/javaee/7/api/javax/persistence/EntityManager.html

, вам нужно сделать:

Fmedia fmedia = new Fmedia(fileID);
fmedia.setFstatus(2);
em.refresh(fmedia); // This will run the "UPDATE .... WHERE nodeid = ?"

или используйте:

Query createQuery(CriteriaUpdate updateQuery)

пример:

CriteriaUpdate<Fmedia> updateCriteria = builder.createCriteriaUpdate(Fmedia.class);
Root<Fmedia> root = updateCriteria.from(Fmedia.class);
updateCriteria.set(Fmedia.fstatus, 2); // make this public from the model
updateCriteria.where(builder.equal(root.get(Fmedia.nodeid), fileID)); // public instead of private
em.createQuery(updateCriteria).executeUpdate();
...