3

我的数据库中需要 MyISAM 表和 InnoDB 表,我正在使用 hbm2ddl 创建它们。我可以使用 Hibenrate hbm2ddl 在同一个数据库中创建 MyISAM 和 InnoDB 表吗?似乎选择方言迫使我使用其中一种。

4

1 回答 1

2

好吧,正如您所写,如果您使用以下命令,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.

于 2010-08-01T22:09:28.070 回答