【发布时间】:2010-08-01 08:30:36
【问题描述】:
我的数据库中需要 MyISAM 表和 InnoDB 表,我使用 hbm2ddl 创建它们。我可以使用 Hibenrate hbm2ddl 在同一个数据库中创建 MyISAM 和 InnoDB 表吗? 似乎选择方言迫使我使用其中一种。
【问题讨论】:
标签: mysql hibernate innodb myisam hbm2ddl
我的数据库中需要 MyISAM 表和 InnoDB 表,我使用 hbm2ddl 创建它们。我可以使用 Hibenrate hbm2ddl 在同一个数据库中创建 MyISAM 和 InnoDB 表吗? 似乎选择方言迫使我使用其中一种。
【问题讨论】:
标签: mysql hibernate innodb myisam hbm2ddl
好吧,正如您所写,如果您使用 MySQL5InnoDBDialect,Hibernate 将生成 InnoDB 表:
public class MySQL5InnoDBDialect extends MySQL5Dialect {
public boolean supportsCascadeDelete() {
return true;
}
public String getTableTypeString() {
return " ENGINE=InnoDB";
}
public boolean hasSelfReferentialForeignKeyBug() {
return true;
}
}
使用这种方言会导致 Hibernate 在 CREATE TABLE 语句的末尾添加 ENGINE=InnoDB。但这是全局设置,您无法在实体级别调整此行为。
要使用 hbm2ddl 并混合使用两个表引擎,我的建议是在事后更改特定表。为此,您可以使用5.7. Auxiliary database objects。来自文档:
5.7. Auxiliary database objects
辅助数据库对象允许 任意的 CREATE 和 DROP 数据库对象。和这个结合 Hibernate 的模式演化工具, 他们有能力完全定义 Hibernate 中的用户模式 映射文件。虽然设计 专门用于创建和删除 触发器或存储之类的东西 过程,任何可以执行的 SQL 命令 通过运行 java.sql.Statement.execute() 方法是 有效(例如,ALTER、INSERTS、 ETC。)。基本上有两种模式 用于定义辅助数据库 对象:
第一种模式是显式列出 中的 CREATE 和 DROP 命令 映射文件:
<hibernate-mapping> ... <database-object> <create>CREATE TRIGGER my_trigger ...</create> <drop>DROP TRIGGER my_trigger</drop> </database-object> </hibernate-mapping>第二种模式是提供自定义 构造 CREATE 的类和 删除命令。这个自定义类必须 实施
org.hibernate.mapping.AuxiliaryDatabaseObject界面。<hibernate-mapping> ... <database-object> <definition class="MyTriggerDefinition"/> </database-object> </hibernate-mapping>此外,这些数据库对象 可以选择范围,以便它们 仅适用于某些方言 用过。
<hibernate-mapping> ... <database-object> <definition class="MyTriggerDefinition"/> <dialect-scope name="org.hibernate.dialect.Oracle9iDialect"/> <dialect-scope name="org.hibernate.dialect.Oracle10gDialect"/> </database-object> </hibernate-mapping>
另一种选择是(ab)使用Hibernate import.sql feature 来执行ALTER。
【讨论】: