Исключение в потоке "main" java .lang.IllegalArgumentException: org.hibernate.QueryException: не удалось разрешить свойство: - PullRequest
0 голосов
/ 31 марта 2020

Я использую JPA в приложении Java. Я пытаюсь обновить свои данные в mysql, но я получил это исключение

Exception in thread "main" java.lang.IllegalArgumentException: org.hibernate.QueryException: could not resolve property: last_updated_mdm_id of: com.avanir.mdm.app.model.hcp.MdmId [UPDATE com.avanir.mdm.app.model.hcp.MdmId e SET e.last_updated_mdm_id = :id where e.last_updated_mdm_id = :nextid]


Как решить эту проблему? Спасибо.

Мой код

 public static void updateMdmId(String lastUpdatedMdmId) throws IOException {

        EntityManager em = Persistence.createEntityManagerFactory("abc").createEntityManager();
        String id = Integer.toString(Integer.parseInt(lastUpdatedMdmId) +1 );
        em.getTransaction().begin();
        Query query = em.createQuery("UPDATE MdmId e SET e.last_updated_mdm_id = :id" +
                " where e.last_updated_mdm_id = :nextid");
        query.setParameter("id", id);
        query.setParameter("nextid", lastUpdatedMdmId);
        int rowsUpdated = query.executeUpdate();
        System.out.println("entities Updated: " + rowsUpdated);
        em.getTransaction().commit();
        em.close();
    }

des c таблица

mysql> desc mdm_id;
+---------------------+-------------+------+-----+---------+-------+
| Field               | Type        | Null | Key | Default | Extra |
+---------------------+-------------+------+-----+---------+-------+
| last_updated_mdm_id | varchar(20) | NO   | PRI | NULL    |       |
+---------------------+-------------+------+-----+---------+-------+
1 row in set (0.64 sec)

Ответы [ 2 ]

0 голосов
/ 31 марта 2020

вы пытаетесь изменить первичный ключ, и jpa не позволит вам его изменить. поэтому одно из решений заключается в том, чтобы сохранить его и удалить предыдущую запись.

0 голосов
/ 31 марта 2020

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

  1. Создайте клон объекта, который вы хотите обновить.
  2. Удалите его из таблицы.
  3. Обновите объект и вставьте его как новую запись в таблица.

Согласно спецификации JPA :

  • Класс сущности должен быть аннотирован с помощью заметки сущности.
  • сущность Класс должен иметь конструктор без аргументов.
  • Класс сущности не должен быть окончательным.
  • Класс сущности должен реализовывать интерфейс Serializable. Класс сущности должен иметь уникальный неизменный идентификатор

Поэтому в целом я не думаю, что Hibernate позволит вам изменить первичный ключ таблицы с помощью операторов обновления.

...