我正在使用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,那麼「讀取」和「刪除」都不會被更新,所以這也不是我正在尋找的。
...幫助?
你可以粘貼堆棧跟蹤嗎?我從來沒有聽說過這種情況。你可以嘗試在這兩列中添加註解'@Temporal(TemporalType.TIMESTAMP)'(同時刪除insertable = false)。 – Augusto 2011-03-02 15:31:08
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