我可以使用Hibernate hbm2ddl在同一个数据库中创建MyISAM和InnoDB表

时间:2010-08-01 08:30:37

标签: mysql hibernate innodb myisam hbm2ddl

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

1 个答案:

答案 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