JPA 2.0 Eclipse Link - PullRequest
       18

JPA 2.0 Eclipse Link

0 голосов
/ 29 апреля 2010

У меня есть этот код

@Column(updatable=false)
@Enumerated(EnumType.STRING)
private ExamType examType;

Тем не менее, я все еще могу изменить значение при обновлении через слияние. Почему?

1 Ответ

6 голосов
/ 30 апреля 2010

Хорошо. Во-первых, если вы хотите, чтобы столбец 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 (что дублирует предыдущий).

...