2009-09-22 1 views
19

JPA를 사용하여 Hibernate를 MyISAM 대신 MySQL InnoDB 테이블을 만들려면 어떻게해야합니까? 테이블을 생성하기 위해 SQL 파일을 생성하기 위해 Hibernate를 사용할 때 작동 할 솔루션을 찾았지만 "즉시"는 작동하지 않습니다.Hibernate : MyISAM 대신 Mysql InnoDB 테이블을 생성

+0

에 대한 일을 했습니까? – skaffman

+0

예. 분명히 'delimiter = type = InnoDB'를 설정하는 것은 스크립트 출력에서만 작동합니다. 나는 'hibernate.hbm2ddl.auto = create'를 시도하고 MyISAM 테이블을 얻었다. –

+0

[HHH-8050] (https://hibernate.onjira.com/browse/HHH-8050) –

답변

28

당신은 최대 절전 모드 사투리를 지정하고 당신이 당신의 최대 절전 모드 구성에서 사투리 설정을 지정하는 org.hibernate.dialect.MySQLInnoDBDialect

+0

이 작업을 수행했습니다. 감사! –

+7

이 답변은 이제 더 이상 사용되지 않습니다. 현재 제안 된 접근 방식은 'hibernate.dialect.storage_engine = innodb' 속성을 사용하는 것입니다. http://in.relation.to/2017/02/20/mysql-dialect-refactoring/ – Jules

9

사용할 수 없습니다? 그렇지 않다면, Hibernate는 데이터베이스 사투리를 자동 검출하려고 시도 할 것이고, MySQL 4 MyISAM 인 가장 안전한 MySQL 다이얼 렉을 선택할 것이다.

당신은 당신의 최대 절전 모드 속성이 추가하여, 그것을 특정 방언을 제공 할 수 있습니다 : 나는 봄 3.2 hibernate4 사용하고 JPA에 감싸려고

hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect 
+0

예, MySQL5Dialect 세트가 있습니다. 팁 고마워! –

1

.

나는 내 자신의 클래스 파일에 org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter의 전체 내용을 복사하여 MySQL의 방언으로 변경 한 서브 루틴의 출력을 수정 .... 내 자신의 클래스를 생성 결국 MySQL5InnoDBDialect. 나는 수업을 확장 할 수 있었다고 생각한다. 어쨌든

...

는 다음과 같이 수정 : 당신이이 '해킹'는 생각

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

} 

하지만, 나는 그것이 작동 같아요. Spring 컨텍스트의 설정에서, 나는 추가 : 그럼 내 클래스는 "데이터베이스"어댑터 콩에 사용되는

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

합니다. (어떤 구성 요소 스캔은 내 수업은 META-INF/persistence.xml을 (기본 위치)에 표시되지 않음)

0

아, 소년 .... 죄송들 ... 인터넷 검색은 다른 검색 결과를 제공합니다 더 :

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

그래서 클래스를 확장하거나 변경할 필요가 없습니다 ... 내가 대답하기 전에 원래 HibernateJpaVendorAdapter의 원본 소스 코드를 읽었어야합니다. 그것은 나를 "databasePlatform"프로퍼티로 감추었습니다 ...

2

Hibernate 5.2.8에서 다른 답변에 사용 된 Mysql*InnoDBDialect 클래스는 더 이상 사용되지 않습니다. 새로운 솔루션은 다음 속성을 설정하는 것입니다 :

hibernate.dialect.storage_engine = innodb 

자세한 내용은 http://in.relation.to/2017/02/20/mysql-dialect-refactoring/을 참조하십시오. 당신이 hbm2ddl을의 구성 설정을 사용하여 뜻 이듬해 봄 부팅 2.0.0M7와

0

나 (mysqld를 5.7)

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