无效的语法错误“type=MyISAM"在 Hibernate 生成的 DDL 中
我的 Java 代码出现此错误
I am getting this error for my Java code
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传递的查询:
This is the query passed by 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负责创建表,所以我不明白错误在哪里,以及如何修复它.
I have looked at all questions related to this error. But in all that questions the user itself is passing query "type = MyISAM
" so they can change "type
" to "engine
", but here hibernate is responsible for creating table, so I don't understand where the mistake is, and how I can fix it.
这是我的配置文件:
<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();
}
}
推荐答案
问题在于 - 在 Hibernate 5.x 及更早版本中 - 方言 org.hibernate.dialect.MySQLDialect
适用于 MySQL 4.x 或更早版本.此方言生成的片段 TYPE=MYISAM
在 MySQL 4.0 中已弃用,并在 5.5 中删除.
The problem is that - in Hibernate 5.x and earlier - the dialect org.hibernate.dialect.MySQLDialect
is for MySQL 4.x or earlier. The fragment TYPE=MYISAM
that is generated by this dialect was deprecated in MySQL 4.0 and removed in 5.5.
鉴于您使用 MariaDB,您需要使用(取决于 MariaDB 的版本和 - 也许 - Hibernate 的版本)以下之一:
Given that you use MariaDB, you need to use (depending on the version of MariaDB and - maybe - the version of Hibernate) one of:
org.hibernate.dialect.MariaDBDialect
org.hibernate.dialect.MariaDB53Dialect
如果您使用的是 MySQL,或者如果您的 Hibernate 版本中不存在上述 MariaDB 的两种方言:
If you are using MySQL, or if the above two dialects for MariaDB don't exist in your version of Hibernate:
org.hibernate.dialect.MySQL5Dialect
org.hibernate.dialect.MySQL55Dialect
org.hibernate.dialect.MySQL57Dialect
相关文章