语法错误无效" type = MyISAM"在Hibernate生成的DDL中

时间:2017-05-01 08:00:51

标签: 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 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-mapping>
    <class name="first.Employee" table="EMPLOYEE">
        <id name="id" type="int">
            <column name="emp_id" />
            <generator class="assigned" />
        </id>
        <property name="fname" type="java.lang.String">
            <column name="FNAME" />
        </property>
        <property name="lname" type="java.lang.String">
            <column name="LNAME" />
        </property>
    </class>
</hibernate-mapping>

这是我的班级档案:

public class StoreData {
    public static void main(String[] args) {
        Configuration cfg=new Configuration();
        cfg.configure("hibernate.cfg.xml");
        SessionFactory factory=cfg.buildSessionFactory();
        Session session=factory.openSession();
        org.hibernate.Transaction t=session.beginTransaction();
        Employee e=new Employee();
        e.setId(1);
        e.setFname("yogesh");
        e.setLname("Meghnani");
        session.persist(e);
        t.commit();

    }
}

8 个答案:

答案 0 :(得分:85)

问题是方言org.hibernate.dialect.MySQLDialect适用于MySQL 4.x或更早版本。此方言生成的片段TYPE=MYISAM在MySQL 4.0中已弃用,在5.5中已删除。

鉴于你使用MariaDB,你需要使用(取决于MariaDB的版本和 - 也许 - Hibernate的版本)之一:

  • org.hibernate.dialect.MariaDBDialect
  • org.hibernate.dialect.MariaDB53Dialect

如果您使用的是MySQL,或者您的Hibernate版本中不存在MariaDB的上述两种方言:

  • org.hibernate.dialect.MySQL5Dialect
  • org.hibernate.dialect.MySQL55Dialect
  • org.hibernate.dialect.MySQL57Dialect

答案 1 :(得分:12)

与方言相关的问题,而不是org.hibernate.dialect.MySQLDialect,您可以使用org.hibernate.dialect.MySQL5Dialect。它会愉快地工作。

答案 2 :(得分:4)

随着越来越多的组织在其Hibernate代码仍使用旧版本5方言的情况下安装MySQL 8.x,该错误可能会随着频率的增加而出现。

截至2020年6月6日的最新Hibernate 5.4发行版包括以下MySQL方言:

  • MySQL55Dialect
  • MySQL57Dialect
  • MySQL57InnoDBDialect
  • MySQL5Dialect
  • MySQL8Dialect
  • MySQLDialect
  • MySQLInnoDBDialect
  • MySQLISAMDialect

当前的Hibernate 5.4 MySQL方言

这是为MySQL过滤的核心jar文件中的方言。使用正确的选项,而type=MyISAM MySQL例外将成为过去。

enter image description here

答案 3 :(得分:0)

当我使用MySql数据库时,因为方言更改对我不起作用。 最简单的方法是下载并使用标准版本的Sql连接器。绝对不错。

http://www.java2s.com/Code/Jar/m/Downloadmysqlconnectorjar.htm

答案 4 :(得分:0)

在MySQL 4.x.x版本之前,TYPE MYISAM引擎用于存储表,但在MySQL 5.x.x或更高版本中,MySQL使用ENGINE = MYISAM来存储表。 例如

在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;

现在让我们谈论休眠状态,

在休眠状态下,您必须使用以下方言

MySQL <= 4.x.x

<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

MySQL> = 5.x.x。

<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>

它将正常工作。

答案 5 :(得分:0)

MySQL放弃了MyISAM作为默认引擎。现在,它使用InnoDB。您可以使用SequelPro进行验证,方法是单击任意表,然后在底部象限中查找表信息:

enter image description here

在窗口顶部查看MySQL版本:

enter image description here

使用以上信息,我知道我需要方言:

org.hibernate.dialect.MySQL5InnoDBDialect

我可以在我的application.properties中设置方言: enter image description here

答案 6 :(得分:0)

无论您需要哪种在系统上可用的方言,都可以找到可用的方言。

>项目>库> hibernate-core> org.hibernate.dialect

然后,您将看到针对不同数据库的几个“方言”类的,并且您可以测试一个有效的类。这种情况适用于休眠

答案 7 :(得分:0)

我知道这是一篇旧帖子,但我正在分享不同的经历。我也看到了同样的异常,但我有 MySQL 8 和 Springboot+ JPA+ Hibernate 。

我的方言看起来像

spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL8Dialect

但我仍然看到了这个问题。经过一些故障排除后,我注意到问题出在模式 sql 中,我在所有大写字母中都有表创建脚本,并且预计它会很小。例如

CREATE TABLE  item_catalog

代替

CREATE TABLE  ITEM_CATALOG

将模式 s​​ql 中的大小写更改为小写表名后,它工作正常。