Java 无效语法错误“;类型=MyISAM“;在Hibernate生成的DDL中
我的Java代码出现了这个错误Java 无效语法错误“;类型=MyISAM“;在Hibernate生成的DDL中,java,mysql,hibernate,mariadb,Java,Mysql,Hibernate,Mariadb,我的Java代码出现了这个错误 Caused by :`com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException`: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB` server version for the right syntax to use near 'type = `MyISAM`' at l
Caused by :`com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException`: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB` server version for the right syntax to use near 'type = `MyISAM`' at line 1
这是hibernate传递的查询:
Hibernate: create table EMPLOYEE (emp_id integer not null, FNAME varchar(255), LNAME varchar(255), primary key (emp_id)) type=MyISAM
我已经查看了所有与此错误相关的问题。但在所有这些问题中,用户本身都在传递查询“type=MyISAM
”,这样他们就可以将“type
”更改为“engine
”,但在这里,hibernate负责创建表,所以我不知道错误在哪里,以及如何修复它
这是我的配置文件:
<hibernate-configuration>
<session-factory >
<property name="hibernate.hbm2ddl.auto">create</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost/servletcheck</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password"> </property>
<property name="hibernate.dialect"> org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.show_sql">true</property>
<mapping resource="Employee.hbm.xml"/>
</session-factory>
</hibernate-configuration>
问题是,在Hibernate 5.x和更早版本中,方言
org.Hibernate.dialogue.mysqldialogue
是针对MySQL 4.x或更早版本的。由这种方言生成的片段TYPE=MYISAM
在MySQL 4.0中被弃用,在5.5中被删除
考虑到您使用的是MariaDB,您需要使用(取决于MariaDB的版本,可能还有Hibernate的版本)以下其中一种:
org.hibernate.dial.MariaDBDialect
org.hibernate.dial.MariaDB53Dialect
org.hibernate.dialogue.mysql5dialogue
org.hibernate.dialogue.mysql55dialogue
org.hibernate.dialogue.mysql57dialogue
org.hibernate.dialogue.mysqldialogue
你可以选择org.hibernate.dialogue.mysql5dialogue
。它会很好地工作。因为当我使用MySql数据库时,方言更改对我不起作用。
最简单的方法是下载并使用标准版本的Sql connector。工作非常好
在MySQL 4.x.x版本之前,键入MYISAM engine用于存储表,但在MySQL 5.x.x或更高版本中,使用MySQL engine=MYISAM存储表。 e、 g 在MySQL 4.x.x或<4.x.x中
CREATE TABLE t (i INT) TYPE = MYISAM;
在MySQL 5.x.x或>5.x.x中
CREATE TABLE t (i INT) ENGINE = MYISAM;
现在我们来谈谈冬眠
在hibernate中,必须使用下面给出的方言
MySQL=5.x.x
org.hibernate.dialogue.mysql5dialogue
它可以正常工作。MySQL放弃MyISAM作为默认引擎。现在它使用InnoDB。您可以使用SequelPro来验证这一点,方法是单击任何表格,然后在底部象限中查找表格信息: 并在窗口顶部查看MySQL版本: 使用上述信息,我知道我需要方言:
org.hibernate.dialent.mysql5innodbdialent
我可以在应用程序中设置方言。属性:
随着越来越多的组织在Hibernate代码仍然使用旧版本5的情况下安装MySQL 8.x,这个错误可能会越来越频繁 截至2020年6月6日的最新Hibernate 5.4发行版包括以下MySQL方言:
- mysql55方言
- MySQL57方言
- mysql57innodbdial
- MySQL5方言
- MySQL8方言
- MySQL方言
- mysqlinnodbdial
- MySQLISAMDialect
无论您需要哪个数据库的方言在您的系统上运行,都可以找到可用的方言 >项目>库>hibernate核心>org.hibernate.dial
然后,您将看到一个包含不同数据库的几个“方言”类的包,您可以测试一个有效的类。本案例适用于hibernate我知道这是一篇老文章,但我正在分享另一种体验。我也看到了同样的异常,但我有带Springboot+JPA+Hibernate的MySQL 8 我的方言看起来像
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL8Dialect
但我仍然看到了这个问题。在进行了一些故障排除之后,我注意到问题出在schema sql中,我的表创建脚本使用了所有大写字母,并且应该使用小写字母。比如说
CREATE TABLE item_catalog
而不是
CREATE TABLE ITEM_CATALOG
将schema sql中的大小写更改为小写表名后,效果良好。请再次阅读问题…我几乎已经阅读了所有与此相关的问题..您链接的问题,但我没有找到任何解决方案。在所有这些问题中,他们都在传递sql查询,但我在这里使用hibernate创建表。@Jarrodrobson这个问题不是链接问题的重复,因为这里的问题是由hibernate方言生成的DDL,而不是一般问题。@ScaryWombat-它不是“完全重复”。OP知道问题出在
TYPE
,但“duplicate”没有说明如何解决hibernate
的问题。因此,我特此撤销这一问题的副本。让马克的答案成为一个好答案。Hibernate 6将包含更少的方言。在Hibernate6中,方言将使用连接元数据来配置自身,以启用或禁用功能。当版本6发布时,我删掉了寻找新方言的建议,以反映您的见解。
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL8Dialect
CREATE TABLE item_catalog
CREATE TABLE ITEM_CATALOG