2010-04-29 57 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