JPA 2.0 Eclipse Link

Gor*_*Ape 0 java orm jpa eclipselink jpa-2.0

我有这个代码

@Column(updatable=false)
@Enumerated(EnumType.STRING)
private ExamType examType;
Run Code Online (Sandbox Code Playgroud)

但是,当我通过合并更新它时,我仍然可以更改该值.为什么?

Pas*_*ent 6

好.首先,如果您希望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;

    ...
}
Run Code Online (Sandbox Code Playgroud)

以下测试方法可以在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());
}
Run Code Online (Sandbox Code Playgroud)

在生成的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中这样一个基本的东西的错误是不太可能的,如果我可能:)不仅仅是你身边的错误:)


更新:在阅读了OP的评论后,我想我现在得到了一个问题(说实话还不完全清楚):OP实际上并不希望examType更新,这与我最初的理解正好相反.因此OP实际上面临Bug 243301(修复将在2.0.2中发布):

EclipseLink仅允许映射可写或只读.标记为insertable = false和updatable = false的映射将设置为只读.

Bug 294803中描述了另一种解决方法(前一个重复).