我有這樣的代碼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