我的数据库中需要 MyISAM 表和 InnoDB 表,我正在使用 hbm2ddl 创建它们。我可以使用 Hibenrate hbm2ddl 在同一个数据库中创建 MyISAM 和 InnoDB 表吗?似乎选择方言迫使我使用其中一种。
1 回答
好吧,正如您所写,如果您使用以下命令,Hibernate 将生成 InnoDB 表MySQL5InnoDBDialect
:
public class MySQL5InnoDBDialect extends MySQL5Dialect {
public boolean supportsCascadeDelete() {
return true;
}
public String getTableTypeString() {
return " ENGINE=InnoDB";
}
public boolean hasSelfReferentialForeignKeyBug() {
return true;
}
}
使用这种方言将导致 Hibernate在语句ENGINE=InnoDB
的末尾添加 。CREATE TABLE
但这是全局设置,您无法在实体级别调整此行为。
要使用 hbm2ddl 并混合两个表引擎,我的建议是在事后更改特定表。为此,您可以使用5.7。辅助数据库对象。从文档中:
5.7. 辅助数据库对象
辅助数据库对象允许创建和删除任意数据库对象。结合 Hibernate 的模式演化工具,他们能够在 Hibernate 映射文件中完全定义用户模式。尽管专门为创建和删除触发器或存储过程之类的东西而设计,但任何可以通过 java.sql.Statement.execute() 方法运行的 SQL 命令都是有效的(例如,ALTER、INSERTS 等)。定义辅助数据库对象基本上有两种模式:
第一种模式是在映射文件中显式列出 CREATE 和 DROP 命令:
<hibernate-mapping> ... <database-object> <create>CREATE TRIGGER my_trigger ...</create> <drop>DROP TRIGGER my_trigger</drop> </database-object> </hibernate-mapping>
第二种模式是提供构造 CREATE 和 DROP 命令的自定义类。这个自定义类必须实现
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 功能来执行ALTER
.