2009-09-22 33 views
19

Làm cách nào để có được Hibernate (sử dụng JPA) để tạo các bảng InnoDB MySQL (thay vì MyISAM)? Tôi đã tìm thấy các giải pháp mà sẽ làm việc khi sử dụng Hibernate để tạo ra một tập tin SQL để tạo ra các bảng, nhưng không có gì mà hoạt động "trên bay".Hibernate: Tạo các bảng Mysql InnoDB thay vì MyISAM

+0

Bạn có nghĩa là sử dụng các thiết lập cấu hình hbm2ddl? – skaffman

+0

Có. Rõ ràng thiết lập 'delimiter = type = InnoDB' chỉ hoạt động cho đầu ra kịch bản. Tôi đã thử nó với 'hibernate.hbm2ddl.auto = create' và có các bảng MyISAM. –

+0

Tạo một jira cho điều này: [HHH-8050] (https://hibernate.onjira.com/browse/HHH-8050) –

Trả lời

28

bạn không thể chỉ định các phương ngữ Hibernate và sử dụng org.hibernate.dialect.MySQLInnoDBDialect

+0

Điều đó đã làm công việc! Cảm ơn! –

+7

Lưu ý rằng câu trả lời này hiện không được chấp nhận. Cách tiếp cận được đề xuất hiện tại là sử dụng thuộc tính 'hibernate.dialect.storage_engine = innodb'. Xem http://in.relation.to/2017/02/20/mysql-dialect-refactoring/ – Jules

9

Bạn đang xác định các thiết lập phương ngữ trong cấu hình hibernate của bạn? Nếu không, sau đó Hibernate sẽ cố gắng tự động phát hiện phương ngữ cơ sở dữ liệu, và sẽ chọn dialec MySQL an toàn nhất, đó là MySQL 4 MyISAM.

Bạn có thể cung cấp cho nó một phương ngữ cụ thể, bằng cách thêm này để tính ngủ đông của bạn:

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

Có, chúng tôi đã có tập hợp MySQL5Dialect. Cảm ơn vì tiền hỗ trợ! –

1

Tôi đã cố gắng sử dụng hibernate4 với Spring 3.2 và bọc nó trong JPA.

Tôi đã tạo xong lớp của riêng mình .... sao chép toàn bộ nội dung của org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter vào tệp lớp của riêng tôi và sửa đổi đầu ra của một chương trình con để thay đổi Phương ngữ MySQL thành MySQL5InnoDBDialect. Tôi đoán tôi có thể mở rộng lớp học.

Dù sao ...

Modified như:

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

} 

Bạn có thể nghĩ rằng đây là một 'Hack', nhưng tôi cho rằng nó sẽ làm việc. Trong cấu hình ngữ cảnh mùa xuân, tôi đã thêm:

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

Sau đó lớp của tôi được sử dụng cho bộ điều hợp "cơ sở dữ liệu". (Không quét thành phần, các lớp học của tôi được liệt kê trong META-INF/persistence.xml (vị trí mặc định))

0

Oh, cậu bé .... chàng trai xin lỗi ... nhiều Googling cho một kết quả tìm kiếm:

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

Vì vậy, bạn không cần phải mở rộng hoặc thay đổi một lớp ... nên đã đọc mã nguồn ban đầu của HibernateJpaVendorAdapter ban đầu thêm một chút trước khi tôi trả lời. Điều đó đã đưa tôi vào thuộc tính "databasePlatform" ...

2

Kể từ Hibernate 5.2.8, các lớp Mysql*InnoDBDialect được các câu trả lời khác sử dụng sẽ không còn được dùng nữa. Giải pháp mới là đặt thuộc tính sau:

hibernate.dialect.storage_engine = innodb 

Xem http://in.relation.to/2017/02/20/mysql-dialect-refactoring/ để biết thêm chi tiết.

0

Với mùa xuân-boot 2.0.0M7 sau đã làm việc cho tôi (mysqld 5,7)

spring.jpa.hibernate.use-new-id-generator-mappings: true 
spring.jpa.database-platform: org.hibernate.dialect.MySQL5InnoDBDialect 
Các vấn đề liên quan