Хорошо. Во-первых, если вы хотите, чтобы столбец examType
был включен в операторы SQL UPDATE
, вы не должны отмечать его updatable=false
. При этом, похоже, что updatable=false
игнорируется, когда не используется в сочетании с insertable=false
, но это ошибка в EclipseLink ( Ошибка 243301 ), это не то, что говорит JPA. Установите его на true
или удалите.
Во-вторых, со следующей сущностью:
@Entity
public class MyEntity {
@Id
@GeneratedValue
private Long id;
@Column(updatable = true)
@Enumerated(EnumType.STRING)
private ExamType examType;
...
}
Следующий метод тестирования просто отлично работает с EclipseLink:
@Test
public void testUpdateOfEnum() {
MyEntity e = new MyEntity();
e.setExamType(ExamType.A);
em.persist(e);
em.flush();
assertNotNull(e.getId());
assertEquals(ExamType.A, e.getExamType());
e.setExamType(ExamType.B);
em.merge(e);
em.flush();
em.refresh(e); // to ensure we assert against value read from the db
assertEquals(ExamType.B, e.getExamType());
}
Ниже сгенерированных операторов SQL:
INSERT INTO ENTITYWITHENUM (ID, EXAMTYPE) VALUES (?, ?)
bind => [1, A]
UPDATE ENTITYWITHENUM SET EXAMTYPE = ? WHERE (ID = ?)
bind => [B, 1]
SELECT ID, EXAMTYPE FROM ENTITYWITHENUM WHERE (ID = ?)
bind => [1]
Честно говоря, ошибка в такой элементарной вещи в EclipseLink очень маловероятна, если я могу: это больше, чем ошибка на вашей стороне:)
Обновление: После прочтения комментария от ОП, я думаю, что теперь у меня возник вопрос (который был совершенно неясен, если честно): ОП на самом деле не хочет, чтобы examType
был обновлен что является полной противоположностью моего первоначального понимания. Таким образом, ОП на самом деле стоит перед Ошибка 243301 (исправление будет выпущено в 2.0.2):
EclipseLink позволяет отображать только для записи или только для чтения. Отображения, помеченные как вставные = ложные и обновляемые = ложные, будут установлены только для чтения.
Другой обходной путь описан в Ошибка 294803 (что дублирует предыдущий).