2010-04-29 58 views
0

我有这样的代码JPA 2.0 Eclipse的链接

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

不过,我还是可以改变的值,当我通过合并更新。为什么?

+0

更改数据库中的值? DB是哪个? – Bozho 2010-04-29 16:38:38

+0

没有从我的程序.. MySQL5.1 – GorillaApe 2010-04-29 16:43:10

+0

我的意思是 - 数据库中的值是否改变? – Bozho 2010-04-29 16:49:13

回答

6

好的。首先,如果您希望陈述中包含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(前一个重复)中描述。

+0

我说我不想更新... IT应该是固定的...... UPDATE ENTITYWITHENUM SET EXAMTYPE =?WHERE(ID =?) bind => [B,1] 永远不应该被称为... 你告诉我如何更新?我不想要更新的价值...对不起 – GorillaApe 2010-04-30 08:01:56

+0

@Parhs我很抱歉,但我回答了我从你的问题了解到的。我想我的答案是 – 2010-04-30 08:17:17

+0

我不是英语母语的人:( 反正...我想做一个特定的柱子只读,但是可以插入 因为的bug ... insertable = false和updatable = false只会工作。但设置假我不能坚持! 因此,只有这些解决方案出现在我的脑海里...... 1)通过id查找,然后手动更新附属实体。 2)创建一个自定义更新查询(这对我来说似乎很差) – GorillaApe 2010-04-30 08:33:44