Hibernate: Create Mysql InnoDB tables instead of MyISAM

JavaMysqlHibernateJpaInnodb

Java Problem Overview


How can I get Hibernate (using JPA) to create MySQL InnoDB tables (instead of MyISAM)? I have found solutions that will work when using Hibernate to generate an SQL file to create the tables, but nothing that works "on the fly".

Java Solutions


Solution 1 - Java

Can't you specify the Hibernate dialect and use

hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect

Edit

From MySQL version > 5.1 this should be

hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect

to avoid running into this issue https://stackoverflow.com/questions/18338876/using-type-innodb-in-mysql-throws-exception

Solution 2 - Java

Go to this link:

mysql-dialect-refactoring

It clearly says :

> Traditionally, MySQL used the non-transactional MyISAM storage engine, and this is the default storage engine for all Dialects that are older than MySQL55Dialect. From MySQL55Dialect onwards, the InnoDB storage engine is used by default.

Put the following in your application.properties (or in your config):

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

Notice 55 in above. - not just 5.

And you can see it in the console too:

Hibernate: create table users_events (user_id bigint not null, event_id bigint not null) engine=InnoDB
Hibernate: create table users_roles (user_id bigint not null, role_id bigint not null) engine=InnoDB

Hope it helps.

Solution 3 - Java

Are you specifying the dialect setting in your hibernate configuration? If not, then Hibernate will attempt to auto-detect the database dialect, and will choose the safest MySQL dialec, which is MySQL 4 MyISAM.

You can give it a specific dialect, by adding this to your hibernate properties:

hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect

Solution 4 - Java

As of Hibernate 5.2.8, the Mysql*InnoDBDialect classes used by the other answers are deprecated. The new solution is to set the following property:

hibernate.dialect.storage_engine = innodb

See http://in.relation.to/2017/02/20/mysql-dialect-refactoring/ for more details.

Solution 5 - Java

With spring-boot 2.0.0M7 following did work for me (mysqld 5.7)

spring.jpa.hibernate.use-new-id-generator-mappings: true
spring.jpa.database-platform: org.hibernate.dialect.MySQL5InnoDBDialect

Solution 6 - Java

For newer versions, you can use

hibernate.dialect.storage_engine=innodb
hibernate.dialect=org.hibernate.dialect.MySQL5Dialect

Other options for hibernate.dialect can be MySQL55Dialect or MySQL57Dialect

Just in case of Spring Boot 2

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL57Dialect
spring.jpa.properties.hibernate.dialect.storage_engine=innodb

Solution 7 - Java

If you are using Hibernate 5.2.8+, try using the MySQL55Dialect, which according to the link provided by Jules, sets innoDB by default as the storage engine.

Solution 8 - Java

I was trying to use hibernate4 with Spring 3.2 and wrap it in JPA.

I ended up creating my own class.... copied the entire contents of the org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter into my own class file and modifying the output of one subroutine to change the MySQL Dialect to MySQL5InnoDBDialect. I guess I could have extended the class.

Anyway...

Modified as:

package com.imk.dao.hibernate;

public class HibernateJpaVendorAdapter extends AbstractJpaVendorAdapter {

[ snip snip snip --- use the original code ]

protected Class determineDatabaseDialectClass(Database database) {
	switch (database) {
	case DB2:
		return DB2Dialect.class;
	case DERBY:
		return DerbyDialect.class;
	case H2:
		return H2Dialect.class;
	case HSQL:
		return HSQLDialect.class;
	case INFORMIX:
		return InformixDialect.class;
	case MYSQL:
		return MySQL5InnoDBDialect.class;
	case ORACLE:
		return Oracle9iDialect.class;
	case POSTGRESQL:
		return PostgreSQLDialect.class;
	case SQL_SERVER:
		return SQLServerDialect.class;
	case SYBASE:
		return SybaseDialect.class;
	default:
		return null;
	}
}

}

You might think this is a 'hack', but, I suppose it will work. In the Spring context config, I added:

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="persistenceUnitName" value="MosJPA" />
    <property name="jpaVendorAdapter">
        <bean class="com.imk.dao.hibernate.HibernateJpaVendorAdapter">
            <property name="database" value="MYSQL" />
        </bean>
    </property>
</bean>

Then my class is used for the "database" adapter bean. (no component scanning, my classes are listed in META-INF/persistence.xml (the default location))

Solution 9 - Java

in case you choose application.yml

spring:
  jpa:
    properties:
      hibernate:
        dialect: org.hibernate.dialect.MySQL5InnoDBDialect

Solution 10 - Java

Here are the properties from my persistence.xml that fixed it. You can use those in Spring or directly in Hibernate, whatever your dev stack:

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

Solution 11 - Java

Oh, boy....sorry guys... more Googling gives another search result:

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="persistenceUnitName" value="MosJPA" />
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="databasePlatform" value="org.hibernate.dialect.MySQL5InnoDBDialect" />
        </bean>
    </property>
</bean>

So, you don't need to extend or change a class...should have read the original source code of the original HibernateJpaVendorAdapter a bit further before I answered. That clued me into the "databasePlatform" property...

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionDavid TinkerView Question on Stackoverflow
Solution 1 - JavaPascal ThiventView Answer on Stackoverflow
Solution 2 - JavaAjay KumarView Answer on Stackoverflow
Solution 3 - JavaskaffmanView Answer on Stackoverflow
Solution 4 - JavaJulesView Answer on Stackoverflow
Solution 5 - JavaOliver SahnerView Answer on Stackoverflow
Solution 6 - JavaYura GalavayView Answer on Stackoverflow
Solution 7 - JavaOzzyTheGiantView Answer on Stackoverflow
Solution 8 - JavaJames BarwickView Answer on Stackoverflow
Solution 9 - JavaSalutonMondoView Answer on Stackoverflow
Solution 10 - JavaSlava ImeshevView Answer on Stackoverflow
Solution 11 - JavaJames BarwickView Answer on Stackoverflow