我有这样的代码JPA 2.0 Eclipse的链接
@Column(updatable=false)
@Enumerated(EnumType.STRING)
private ExamType examType;
不过,我还是可以改变的值,当我通过合并更新。为什么?
我有这样的代码JPA 2.0 Eclipse的链接
@Column(updatable=false)
@Enumerated(EnumType.STRING)
private ExamType examType;
不过,我还是可以改变的值,当我通过合并更新。为什么?
好的。首先,如果您希望陈述中包含examType
列,则不应将其标记为updatable=false
。话虽如此,看起来updatable=false
不与insertable=false
结合使用时会被忽略,但这是EclipseLink(Bug 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中这样一个基本的东西的bug是不可能的,不仅仅是一个mista柯就在你身边,如果我可以:)
更新:从OP阅读评论之后,我觉得我现在的问题(这是完全不清楚是诚实的):在OP实际上其不会”我想要更新examType
,这与我最初的理解完全相反。所以OP实际上面临着Bug 243301(修正将在2.0.2中发布):
EclipseLink只允许映射是可写或只读的。标记为insertable = false和updatable = false的映射将被设置为只读。
另一个解决方法在Bug 294803(前一个重复)中描述。
我说我不想更新... IT应该是固定的...... UPDATE ENTITYWITHENUM SET EXAMTYPE =?WHERE(ID =?) bind => [B,1] 永远不应该被称为... 你告诉我如何更新?我不想要更新的价值...对不起 – GorillaApe 2010-04-30 08:01:56
@Parhs我很抱歉,但我回答了我从你的问题了解到的。我想我的答案是 – 2010-04-30 08:17:17
我不是英语母语的人:( 反正...我想做一个特定的柱子只读,但是可以插入 因为的bug ... insertable = false和updatable = false只会工作。但设置假我不能坚持! 因此,只有这些解决方案出现在我的脑海里...... 1)通过id查找,然后手动更新附属实体。 2)创建一个自定义更新查询(这对我来说似乎很差) – GorillaApe 2010-04-30 08:33:44
更改数据库中的值? DB是哪个? – Bozho 2010-04-29 16:38:38
没有从我的程序.. MySQL5.1 – GorillaApe 2010-04-29 16:43:10
我的意思是 - 数据库中的值是否改变? – Bozho 2010-04-29 16:49:13