web-dev-qa-db-fra.com

Erreur de syntaxe non valide "type = MyISAM" dans le DDL généré par Hibernate

Je reçois cette erreur pour mon code 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

Voici la requête passée par hibernate:

Hibernate: create table EMPLOYEE (emp_id integer not null, FNAME varchar(255), LNAME varchar(255), primary key (emp_id)) type=MyISAM

J'ai examiné toutes les questions liées à cette erreur. Mais dans toutes ces questions, l'utilisateur lui-même passe la requête "type = MyISAM" pour pouvoir changer "type" en "engine", mais ici, hibernate est responsable de la création de la table, je ne comprends donc pas où se trouve l'erreur, ni comment je peux répare le.

Ceci est mon fichier de configuration:

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

Ceci est mon fichier de mapping:

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

Ceci est mon fichier de classe:

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

    }
}
25
yogesh meghnani

Le problème est que le dialecte org.hibernate.dialect.MySQLDialect est pour MySQL 4.x ou une version antérieure. Le fragment TYPE=MYISAM généré par ce dialecte était obsolète dans MySQL 4.0 et supprimé dans la version 5.5. 

Étant donné que vous utilisez MariaDB, vous devez utiliser (en fonction de la version de MariaDB et - peut-être de la version d'Hibernate) l'un des éléments suivants:

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

Si vous utilisez MySQL, ou si les deux dialectes ci-dessus pour MariaDB n'existent pas dans votre version d'Hibernate:

  • org.hibernate.dialect.MySQL5Dialect
  • org.hibernate.dialect.MySQL55Dialect
  • org.hibernate.dialect.MySQL57Dialect
77
Mark Rotteveel

C'est un problème lié au dialecte. Au lieu de org.hibernate.dialect.MySQLDialect, vous pouvez utiliser org.hibernate.dialect.MySQL5Dialect. Cela fonctionnera avec bonheur.

10
Brajesh

Comme le changement de dialecte ne fonctionne pas pour moi lorsque j'utilise la base de données MySql ... Le plus simple consiste à télécharger et à utiliser la version standard du connecteur SQL A fonctionné absolument bien.

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

0
Vaibhav Jain