2011-03-02 64 views
2

我正在使用JPA(Hibernate)在MySQL 5.0服務器上存儲實體。正在更新JPA實體在空值上失敗

這裏是以簡化的形式的實體:

@Entity 
@Table(name = "messages") 
public class Message implements Serializable 
{ 
    @Id 
    @GeneratedValue 
    @Column 
    private long id; 

    @Column 
    private String content; 

    @Column(insertable = false) 
    private Date read; 

    @Column(insertable = false) 
    private Date deleted; 
} 

的列「讀」,並在表「已刪除」,「郵件」被定義,使得它們可以包含NULL值。當我第一次試圖堅持這些實體之一時,我得到了一個異常。顯然,Hibernate在那裏做的是在插入語句的列表中列出「讀取」和「刪除」列,但不在值列表中。我在上面看到的@Column註釋中用「insertable = false」語句解決了這個問題。

但是,現在我有一個更大的問題。我想將讀取或日期字段設置爲非空值。當我這樣做時,我會得到一個類似的異常「你的SQL語法有錯誤」。他現在正在做的是列出更新語句的where部分中的所有字段,包括「read」和「deleted」。他所做的是檢查像「...和讀取= NULL」。其中,在MySQL中,當然應該是「...並讀取IS NULL」。

翻遍,我已經找到了@Column註釋的「updatable」參數。但是如果我將它設置爲false,那麼「讀取」和「刪除」都不會被更新,所以這也不是我正在尋找的。

...幫助?

+0

你可以粘貼堆棧跟蹤嗎?我從來沒有聽說過這種情況。你可以嘗試在這兩列中添加註解'@Temporal(TemporalType.TIMESTAMP)'(同時刪除insertable = false)。 – Augusto 2011-03-02 15:31:08

+0

java.sql.BatchUpdateException:您的SQL語法中有錯誤;請檢查與您的MySQL服務器版本相對應的手冊,以便在第1行的'read = null,其中id = 2'處使用正確的語法。 \t at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:2020)[ :] \t在com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:1451)[:] \t在org.jboss.resource.adapter.jdbc.WrappedStatement.executeBatch(WrappedStatement.java:774)[:6.0 .0.Final] – 2011-03-02 15:36:49

回答

3

閱讀reserved word in mysql,它看起來像驅動程序不是逃避名稱與反引號。我認爲最好的解決方案是重命名列。

+0

就是這樣。廢話。謝謝! – 2011-03-02 15:47:17