Hibernate生成的DDL中出现无效语法错误“type= MyISAM”

wkyowqbh  于 2022-11-24  发布在  其他
关注(0)|答案(8)|浏览(166)

我的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>

这是我的Map文件:

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

    }
}
sd2nnvve

sd2nnvve1#

问题在于,在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
  • 或更高版本(例如org.hibernate.dialect.MariaDB106Dialect

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

  • org.hibernate.dialect.MySQL5Dialect
  • org.hibernate.dialect.MySQL55Dialect
  • org.hibernate.dialect.MySQL57Dialect
  • org.hibernate.dialect.MySQL8Dialect
  • 或这些方言的变体(例如org.hibernate.dialect.MySQL57InnoDBDialect
igetnqfo

igetnqfo2#

这是一个与方言相关的问题,你可以用org.hibernate.dialect.MySQL5Dialect代替org.hibernate.dialect.MySQLDialect。它会很好地工作。

pdtvr36n

pdtvr36n3#

随着越来越多的组织在其Hibernate代码仍使用旧版本5 Dialect的情况下转而安装MySQL 8.x,此错误可能会越来越频繁地出现。
截至2020年6月6日的最新Hibernate 5.4发行版包含以下MySQL方言:

  • MySQL55方言
  • MySQL57方言
  • MySQL57InnoDB方言
  • MySQL5方言
  • MySQL8方言
  • MySQL方言
  • MySQLInnoDB方言
  • 我的SQLISAM方言
    当前Hibernate 5.4 MySQL方言

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

fcwjkofz

fcwjkofz4#

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

现在我们来谈谈 hibernate ,
在休眠中你必须使用下面给出的方言
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>

它会工作得很好。

taor4pac

taor4pac5#

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

并在窗口顶部显示MySQL版本:

利用上面的信息,我知道我需要方言:
org.hibernate.dialect.MySQL5InnoDBDialect
我可以在我的www.example.com中设置方言application.properties:

5cg8jx4n

5cg8jx4n6#

我知道这是一个老帖子,但我分享了不同的经验。我也看到了同样的例外,但我有MySQL 8与Springboot+ JPA+ Hibernate。
我的方言看起来像

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

但是我还是发现了这个问题。在一些故障排除之后,我注意到这个问题是在模式sql中,我在那里有一个表创建脚本,它应该是小的。例如

CREATE TABLE  item_catalog

代替

CREATE TABLE  ITEM_CATALOG

在将模式sql中的大小写更改为小写表名后,它工作得很好。

6tqwzwtp

6tqwzwtp7#

当我使用MySql数据库时,由于方言更改对我不起作用。最简单的方法是下载并使用Sql连接器的标准版本。工作绝对正常。
http://www.java2s.com/Code/Jar/m/Downloadmysqlconnectorjar.htm

d4so4syb

d4so4syb8#

无论您需要哪个数据库,都可以找到可用的方言。

〉项目〉库〉hibernate-core〉组织. hib.方言

然后你会看到一个,里面有几个不同数据库的“方言”类,你可以测试其中一个能用。

相关问题