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
Trả lời
bạn không thể chỉ định các phương ngữ Hibernate và sử dụng org.hibernate.dialect.MySQLInnoDBDialect
Điều đó đã làm công việc! Cảm ơn! –
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
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
Có, chúng tôi đã có tập hợp MySQL5Dialect. Cảm ơn vì tiền hỗ trợ! –
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))
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" ...
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.
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
- 1. mysql innodb vs myisam chèn
- 2. Mysql: Chèn hiệu suất INNODB vs MYISAM
- 3. Các khóa ngoài cho các bảng myISAM và InnoDB
- 4. Hiệu suất khác biệt giữa Innodb và Myisam trong Mysql
- 5. Cập nhật nguyên tử MySQL trong InnoDB vs MyISAM
- 6. Khi MyISAM tốt hơn InnoDB?
- 7. Bảng MyISAM MySQL khóa
- 8. Hibernate JPA tạo loại bảng = InnoDB Bài toán
- 9. Thay đổi loại bảng thành InnoDB
- 10. Tìm kiếm toàn văn MySQL Workaround cho các bảng innoDB
- 11. Long Blob innodb hoặc MyISAM
- 12. Thay đổi Công cụ Bảng trong MySQL
- 13. Tìm kiếm Mysql - InnoDB và giao dịch so với MyISAM cho tìm kiếm toàn văn
- 14. InnoDB vs. MyISAM chèn thời gian truy vấn
- 15. InnoDB & Tạm thời bảng
- 16. Các câu lệnh mysql đơn có nguyên tử trong MyISAM và InnoDB không?
- 17. Công cụ lưu trữ cho bảng không hỗ trợ sửa chữa. InnoDB hoặc MyISAM?
- 18. MySQL - Cách nhanh nhất để kiểm tra xem dữ liệu trong bảng InnoDB đã thay đổi
- 19. Tại sao MySQL thêm nhận xét vào các bảng InnoDB?
- 20. InnoDB hoặc MyISAM - Tại sao không phải cả hai?
- 21. khác biệt mysql trong việc sử dụng chỉ số giữa MyISAM và InnoDB
- 22. MySql - Chuyển đổi InnoDB sang Cơ sở dữ liệu lưu trữ MyISAM
- 23. thay đổi công cụ mặc định mysql thành innodb
- 24. Lỗi InnoDB trong Mysql
- 25. Cách an toàn nhất để chuyển đổi bảng với InnoDB thành MyISAM là gì?
- 26. Tối ưu hóa MySQL cho ALTER BẢNG của InnoDB
- 27. Cơ sở dữ liệu MySQL engine: MyISAM cho information_schema nhưng InnoDB cho các cơ sở dữ liệu khác
- 28. mysql lỗi 'TYPE = MyISAM'
- 29. Thay đổi công cụ lưu trữ của bảng trong Mysql
- 30. MySQL - Cách đặt hàng bằng cách liên hệ? INNODB Bảng
Bạn có nghĩa là sử dụng các thiết lập cấu hình hbm2ddl? – skaffman
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. –
Tạo một jira cho điều này: [HHH-8050] (https://hibernate.onjira.com/browse/HHH-8050) –