Java 无效语法错误“;类型=MyISAM“;在Hibernate生成的DDL中

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

我的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 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
如果您使用的是MySQL,或者您的Hibernate版本中不存在上述两种MariaDB方言:

  • 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 5.4 MySQL方言

下面是为MySQL过滤的核心jar文件中的方言。使用正确的方法,例外情况将成为过去


无论您需要哪个数据库的方言在您的系统上运行,都可以找到可用的方言

>项目>库>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