分为三种情况:
1、hbm文件中定义的元素含有sql的关键字
例如: <property name="name"></property><property name="master"></property>
name 和 master都是mysql中的关键字
2、查看实体类中定义的get/set方法有么有类似boolean型的isPass()之类的构造方法,尽量避免。
3.错误原因:你数据库版本或你数据库的存储引擎和你使用的方言对不上,数据库版本规定你需要使用type还是engine,而你数据库引擎则决定是Innodb还是MyISAM
修改方式很简单,你把数据库那三种方言配置都试一下就可以了,反正我是这么解决的。
最开始用的这种方言,结果不行:
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
运行结果如下:
Hibernate:
create table dog (
dogid integer not null auto_increment,
dogname varchar(255),
dogcolor varchar(255),
dogage integer,
primary key (dogid)
) type=MyISAM//这里就是建表不成功的原因
type 和 引擎 和我数据库都不符合
然后是这种,结果还是不行:
<property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
运行后语句如下:
Hibernate:
create table dog (
dogid integer not null auto_increment,
dogname varchar(255),
dogcolor varchar(255),
dogage integer,
primary key (dogid)
) type=InnoDB
org.hibernate.internal.SessionFactoryImpl@11acdc30
因为它的语句中使用的是type=InnoDB,type是早期mysql的语法了
最后是这种,终于可以了:
<property name="org.hibernate.dialect.MySQLMyISAMDialect "></property>
运行结果如下:
Hibernate:
create table dog (
dogid integer not null auto_increment,
dogname varchar(255),
dogcolor varchar(255),
dogage integer,
primary key (dogid)
) engine=InnoDB
org.hibernate.internal.SessionFactoryImpl@759fad4
我数据库是最高版本的,并且存储引擎用的是
InnoDB,所以建表时engine = InnoDB才正确。