【问题标题】:Can I create both MyISAM and InnoDB tables in the same database using Hibenrate hbm2ddl我可以使用 Hibenrate hbm2ddl 在同一个数据库中创建 MyISAM 和 InnoDB 表吗
【发布时间】:2010-08-01 08:30:36
【问题描述】:

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

【问题讨论】:

    标签: mysql hibernate innodb myisam hbm2ddl


    【解决方案1】:

    好吧,正如您所写,如果您使用 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

    【讨论】:

    • 由于 JPA 规范不支持设置引擎和添加索引(外键除外),因此运行 ALTER 脚本听起来可以接受。
    猜你喜欢
    • 1970-01-01
    • 2011-01-08
    • 1970-01-01
    • 2015-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-21
    • 1970-01-01
    相关资源
    最近更新 更多