【问题标题】:Invalid syntax error "type= MyISAM" in DDL generated by HibernateHibernate 生成的 DDL 中的无效语法错误“type=MyISAM”
【发布时间】:2017-09-28 16:32:35
【问题描述】:

我的 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();

    }
}

【问题讨论】:

  • 请再次阅读问题...我几乎已经阅读了所有与之相关的问题..您也链接了那个问题,但我没有任何解决方案。在所有这些问题中,他们都在传递 sql 查询但在这里我使用休眠来创建表。
  • @JarrodRoberson 这个问题不是链接问题的重复,因为这里的问题是由 Hibernate 方言生成的专门 DDL,而不是一般问题。
  • @ScaryWombat - 它不是“完全复制”。 OP 知道TYPE 是问题所在,但“重复”并没有说明如何为hibernate 解决它。所以,我在此不再重复这个问题。并将 Mark's Accepted Answer 保留为一个好的答案。

标签: java mysql hibernate mariadb


【解决方案1】:

问题在于 - 在 Hibernate 5.x 和更早版本中 - 方言 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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      当我使用 MySql 数据库时,方言更改对我不起作用。 最简单的方法是下载和使用标准版的 Sql 连接器。工作得很好。

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

      【讨论】:

        【解决方案4】:

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

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

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

        MySQL>=5.x.x.

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

        它会正常工作的。

        【讨论】:

          【解决方案5】:

          MySQL 删除了 MyISAM 作为默认引擎。现在它使用 InnoDB。您可以使用 SequelPro 通过单击任何表格来验证这一点,然后在底部象限中查找表格信息:

          并在窗口顶部查看 MySQL 版本:

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

          org.hibernate.dialect.MySQL5InnoDBDialect

          我可以在我的 application.properties 中设置方言:

          【讨论】:

            【解决方案6】:

            随着越来越多的组织开始安装 MySQL 8.x 而他们的 Hibernate 代码仍在使用旧版本 5 Dialect,此错误可能会随着频率的增加而出现。

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

            • MySQL55方言
            • MySQL57方言
            • MySQL57InnoDB方言
            • MySQL5方言
            • MySQL8方言
            • MySQL方言
            • MySQLInnoDBDialect
            • MySQLISAM方言

            当前 Hibernate 5.4 MySQL 方言

            这是为 MySQL 过滤的核心 jar 文件中的方言。使用正确的,type=MyISAM MySQL 异常将成为过去。

            【讨论】:

            • Hibernate 6 将包含更少的方言。在 Hibernate 6 中,方言将使用连接元数据配置自己以启用或禁用功能。
            • 大吃一惊。我编辑了在第 6 版发布时寻找新方言的建议,以反映您的见解。
            【解决方案7】:

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

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

            然后您将看到一个,其中包含用于不同数据库的几个“方言”类,您可以测试一个有效的。此案例适用于休眠

            【讨论】:

              【解决方案8】:

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

              我的方言是这样的

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

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

              CREATE TABLE  item_catalog
              

              而不是

              CREATE TABLE  ITEM_CATALOG
              

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

              【讨论】:

                猜你喜欢
                • 2012-01-29
                • 2017-02-09
                • 2012-07-13
                • 1970-01-01
                • 2012-09-07
                • 1970-01-01
                • 1970-01-01
                • 2013-08-14
                • 2012-08-23
                相关资源
                最近更新 更多