Field 'id' doesn't have a default value問題解決方案
突然想溫習溫習對資料庫的讀寫,於是就用mysql建了一張單獨的表(見代碼1),用Hibernate寫了個應用,可以正常查詢、修改資料了。開始時,資料是在mysql的GUI工具裏手工輸入的,嫌煩,於是就想到用程式批量產生一些,於是麻煩也跟著來了……
代碼1 Sql代碼 CREATE TABLE `stitp`.`Ticket` ( `id` int(11) NOT NULL, `state` tinyint(1) NOT NULL, `grade` int(2) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=gbk
運行插入資料的java代碼,報異常:field ‘id' doesn't have a default value沒錯啊,我的主鍵怎麼可能有預設值呢。不理解。Google了一下這個異常,一大坨結果,總結一下就是那麼兩種方法:
解決方案一: 開啟my.ini,尋找 sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" 修改為 sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" 然後重啟MYSQL
解決方案二: MySQL 5 uses a strict mode which needs to be disabled. In Windows, Goto Start-->Programs-->MySQL->MySQL Instance Config Wizard. Follow through the Reconfigure Instance option-->Detailed Configuration-->Continue Next a few screens. At the bottom under Enable TCP/IP option there is 'Enable Strict Mode'. Deslect this option (no tick). Save changes and MySQL will restart.
都試了,沒用,而且我是Fedora,沒有ini檔案,而是cnf檔案(我的my.cnf在/etc下面)
這個關鍵字看來是找不到辦法了,換成尋找hibernate裡對主鍵的設定吧。果然就找到了辦法。原來是.hbm.xml檔案的設定問題,在裡面把主鍵的屬性改為: Xml代碼 <generator class="assigned"/>
再運行就可以了。因為assigned是指主鍵是由人工分配的,而native則指主索引值由庫自動給出。我以前都是想都沒想就加上native的,反正也不知道什麼意思,而且以前用到要插入資料的表,主鍵都是“auto increment”的,所以也沒碰到問題。這次就暴露了。
總結一下:其實就是缺乏對Hibernate的全面理解,沒有完全掌握它的各種設定。因為當初學hibernate也是抱著"需求"學的,而不是正兒八經學習它的,沒有完全理解各種設定就上手了。