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)
但是,当我通过合并更新它时,我仍然可以更改该值.为什么?
好.首先,如果您希望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中描述了另一种解决方法(前一个重复).
| 归档时间: |
|
| 查看次数: |
1942 次 |
| 最近记录: |