我需要在我的数据库中使用MyISAM表和InnoDB表,我使用hbm2ddl来创建它们。我可以使用Hibenrate hbm2ddl在同一个数据库中创建MyISAM和InnoDB表吗? 似乎选择方言迫使我使用其中一种。
答案 0 :(得分:2)
好吧,正如您所写,如果您使用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在ENGINE=InnoDB
语句末尾添加CREATE TABLE
。但这是全局设置,您无法在实体级别调整此行为。
要使用hbm2ddl并混合两个表引擎,我的建议是在事实之后更改特定的表。为此,您可以使用5.7. Auxiliary database objects。来自文档:
5.7. Auxiliary database objects
辅助数据库对象允许 任意的CREATE和DROP 数据库对象。和这个结合 Hibernate的架构演化工具, 他们有能力完全定义 Hibernate中的用户模式 映射文件。虽然设计 专门用于创建和删除 像触发器或存储的东西 程序,任何可以的SQL命令 通过一个 java.sql.Statement.execute()方法是 有效(例如,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 feature来执行ALTER
。