我的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();
}
}
8条答案
按热度按时间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
)igetnqfo2#
这是一个与方言相关的问题,你可以用
org.hibernate.dialect.MySQL5Dialect
代替org.hibernate.dialect.MySQLDialect
。它会很好地工作。pdtvr36n3#
随着越来越多的组织在其Hibernate代码仍使用旧版本5 Dialect的情况下转而安装MySQL 8.x,此错误可能会越来越频繁地出现。
截至2020年6月6日的最新Hibernate 5.4发行版包含以下MySQL方言:
当前Hibernate 5.4 MySQL方言
下面是为MySQL过滤的核心jar文件中的方言。使用正确的方言,type=MyISAM MySQL异常将成为过去。
fcwjkofz4#
在MySQL 4.x.x版本之前,TYPE MYISAM引擎用于存储表,但在MySQL 5.x.x或更高版本中,MySQL使用ENGINE = MYISAM存储表。例如
在MySQL 4.x.x或〈4.x.x中
在MySQL 5.x.x或5.x.x以上版本中
现在我们来谈谈 hibernate ,
在休眠中你必须使用下面给出的方言
MySQL〈= 4.x.x
MySQL〉= 5.x.x.
它会工作得很好。
taor4pac5#
MySQL放弃了MyISAM作为默认引擎。现在它使用InnoDB。您可以使用SequelPro验证这一点,方法是单击任何表,然后在底部象限中查找表信息:
并在窗口顶部显示MySQL版本:
利用上面的信息,我知道我需要方言:
org.hibernate.dialect.MySQL5InnoDBDialect
我可以在我的www.example.com中设置方言application.properties:
5cg8jx4n6#
我知道这是一个老帖子,但我分享了不同的经验。我也看到了同样的例外,但我有MySQL 8与Springboot+ JPA+ Hibernate。
我的方言看起来像
但是我还是发现了这个问题。在一些故障排除之后,我注意到这个问题是在模式sql中,我在那里有一个表创建脚本,它应该是小的。例如
代替
在将模式sql中的大小写更改为小写表名后,它工作得很好。
6tqwzwtp7#
当我使用MySql数据库时,由于方言更改对我不起作用。最简单的方法是下载并使用Sql连接器的标准版本。工作绝对正常。
http://www.java2s.com/Code/Jar/m/Downloadmysqlconnectorjar.htm
d4so4syb8#
无论您需要哪个数据库,都可以找到可用的方言。
〉项目〉库〉hibernate-core〉组织. hib.方言
然后你会看到一个包,里面有几个不同数据库的“方言”类,你可以测试其中一个能用。