最近在做一个博客系统,后台使用 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语句的异常
我想,这个错我再也不会遇到了!!!

本文详细描述了在使用Hibernate工具自动生成数据表时,因实体类变量名与数据库保留字冲突导致SQL语法错误的问题,并通过实例展示了如何识别并解决这一问题。最终,作者通过手动在数据库中创建表并使用正确的变量名成功解决了问题。
2282

被折叠的 条评论
为什么被折叠?



