最近在做一個博客系統,後臺使用 ssh 框架,前臺使用 bootstrap ,因爲不是太熟悉,所以遇到不少問題,但看到成果一步步做出來,喜悅之情溢於言表!
然而今天,遇到了一個讓我崩潰的問題,戰鬥了好久,最後才被解決,感覺代碼之路一片黑暗。
我定義了一個實體類,裏面有一些屬性,然後就用 eclipse 裏 配置的 hibernate 工具去自動生成數據表,這個普通的過程我以前重複過 n 次了,每次都是平穩完成,因爲這根本就算不上能出故障的地方,然後這一次,問題百出。因爲我定義了兩個實體間多對多的關聯關係,在我完成生成數據表步驟後我就去 mysql 中查看我的表是否生成成功,讓我驚訝的是,僅僅生成了一張中間表(關聯表),實體表卻沒有生成!程序也沒有報錯,一切都很正常。我有點無語,認真對照了屬性名是否和配置文件一致,認真查看數據類型是否有錯,又刪掉數據表重新生成......然後重複 n 次後,一切還是原樣。我只好放棄使用 hibernate 工具,自己去數據庫手動建表,按說這應該沒什麼問題了。然後在程序中執行保存操作的時候,又出問題了,報 sql 語法錯誤的異常,我再一次鬱悶了,看着控制檯中的insert語句,看不出半點不對的地方,我不死心,又重複了這個過程 n 次,然而結果並沒有什麼不同,呵呵!最後實在沒辦法了,把控制檯中看似正常的insert語句拿到mysql 的工具 sqlyog 中去執行,也是報sql語法錯的異常,但這次,我看到了一點不同的東西,我的字段居然跟 sql 語句中關鍵字一樣,被着了色!!!我立馬去網上查了一下 mysql 數據庫的關鍵字,果不其然,看到了我的屬性名靜靜的躺在保留字的列表中,瞬間淚崩,我 取了個跟 mysql 數據庫保留字同名的變量名!!!
這是mysql數據庫的保留字:
ADD | ALL | ALTER |
ANALYZE | AND | AS |
ASC | ASENSITIVE | BEFORE |
BETWEEN | BIGINT | BINARY |
BLOB | BOTH | BY |
CALL | CASCADE | CASE |
CHANGE | CHAR | CHARACTER |
CHECK | COLLATE | COLUMN |
CONDITION | CONNECTION | CONSTRAINT |
CONTINUE | CONVERT | CREATE |
CROSS | CURRENT_DATE | CURRENT_TIME |
CURRENT_TIMESTAMP | CURRENT_USER | CURSOR |
DATABASE | DATABASES | DAY_HOUR |
DAY_MICROSECOND | DAY_MINUTE | DAY_SECOND |
DEC | DECIMAL | DECLARE |
DEFAULT | DELAYED | DELETE |
DESC | DESCRIBE | DETERMINISTIC |
DISTINCT | DISTINCTROW | DIV |
DOUBLE | DROP | DUAL |
EACH | ELSE | ELSEIF |
ENCLOSED | ESCAPED | EXISTS |
EXIT | EXPLAIN | FALSE |
FETCH | FLOAT | FLOAT4 |
FLOAT8 | FOR | FORCE |
FOREIGN | FROM | FULLTEXT |
GOTO | GRANT | GROUP |
HAVING | HIGH_PRIORITY | HOUR_MICROSECOND |
HOUR_MINUTE | HOUR_SECOND | IF |
IGNORE | IN | INDEX |
INFILE | INNER | INOUT |
INSENSITIVE | INSERT | INT |
INT1 | INT2 | INT3 |
INT4 | INT8 | INTEGER |
INTERVAL | INTO | IS |
ITERATE | JOIN | KEY |
KEYS | KILL | LABEL |
LEADING | LEAVE | LEFT |
LIKE | LIMIT | LINEAR |
LINES | LOAD | LOCALTIME |
LOCALTIMESTAMP | LOCK | LONG |
LONGBLOB | LONGTEXT | LOOP |
LOW_PRIORITY | MATCH | MEDIUMBLOB |
MEDIUMINT | MEDIUMTEXT | MIDDLEINT |
MINUTE_MICROSECOND | MINUTE_SECOND | MOD |
MODIFIES | NATURAL | NOT |
NO_WRITE_TO_BINLOG | NULL | NUMERIC |
ON | OPTIMIZE | OPTION |
OPTIONALLY | OR | ORDER |
OUT | OUTER | OUTFILE |
PRECISION | PRIMARY | PROCEDURE |
PURGE | RAID0 | RANGE |
READ | READS | REAL |
REFERENCES | REGEXP | RELEASE |
RENAME | REPEAT | REPLACE |
REQUIRE | RESTRICT | RETURN |
REVOKE | RIGHT | RLIKE |
SCHEMA | SCHEMAS | SECOND_MICROSECOND |
SELECT | SENSITIVE | SEPARATOR |
SET | SHOW | SMALLINT |
SPATIAL | SPECIFIC | SQL |
SQLEXCEPTION | SQLSTATE | SQLWARNING |
SQL_BIG_RESULT | SQL_CALC_FOUND_ROWS | SQL_SMALL_RESULT |
SSL | STARTING | STRAIGHT_JOIN |
TABLE | TERMINATED | THEN |
TINYBLOB | TINYINT | TINYTEXT |
TO | TRAILING | TRIGGER |
TRUE | UNDO | UNION |
UNIQUE | UNLOCK | UNSIGNED |
UPDATE | USAGE | USE |
USING | UTC_DATE | UTC_TIME |
UTC_TIMESTAMP | VALUES | VARBINARY |
VARCHAR | VARCHARACTER | VARYING |
WHEN | WHERE | WHILE |
WITH | WRITE | X509 |
XOR | YEAR_MONTH | ZEROFILL |
經驗:1.給實體類取變量名的時候,一定要注意不能和數據庫保留字相沖突
2.用其他工具操作數據庫有錯誤時,一定要將出故障的sql語句拿到數據庫管理工具中去執行,一眼就能看出sql語句的異常
我想,這個錯我再也不會遇到了!!!