У меня возникли трудности с обновлением полей enum с помощью запросов на обновление. Похоже, что всякий раз, когда я обновляю поле перечисления новым значением, обновленное значение невозможно сопоставить для новых запросов. Запрос на обновление отлично работает для других типов данных, но не для перечислений.
Я попытался закрыть EntityManager, EntityManagerFactory, приложение, но по какой-то причине поле не может быть сопоставлено в его новом состоянии.
Ниже приведен тест, который я использую, где экземпляр "db" - это просто класс, который обрабатывает создание, закрытие и транзакции для EntityManager.
@Test
public void test() {
db.execute(em -> em.createQuery("UPDATE Atmosphere SET setting = :setting WHERE id=:id", Atmosphere.class)
.setParameter("setting", Atmosphere.Setting.coast)
.setParameter("id", atmosphere1.getId()).executeUpdate());
List<Atmosphere> results = db.retrieve(em -> em.createQuery("SELECT FROM Atmosphere WHERE id = :id", Atmosphere.class)
.setParameter("id", atmosphere1).getResultList());
assertFalse(results.isEmpty()); // passes
assertEquals(Atmosphere.Setting.coast, results.get(0).getSetting()); // passes, the record is updated!
results = db.retrieve(em -> em.createQuery("SELECT FROM Atmosphere WHERE setting = :setting", Atmosphere.class)
.setParameter("setting", Atmosphere.Setting.coast)
.getResultList());
assertFalse(results.isEmpty()); // fails, no results!
}
Я также проверил строку в инструменте проводника и вижу, что она обновлена, но я все еще не могу запросить ее.
Единственное, что, похоже, работает, это обновление записи с использованием EntityManager.merge()
.
РЕДАКТИРОВАТЬ: Оказывается, проблема возникает только при использовании @Enumerated(EnumType.STRING)
в поле enum объекта. Устранение этой проблемы решает проблему (в objectdb 2.7.6).