代码之家  ›  专栏  ›  技术社区  ›  Oded Peer

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

  •  3
  • Oded Peer  · 技术社区  · 16 年前

    似乎选择方言迫使我使用一种或另一种。

    1 回复  |  直到 16 年前
        1
  •  2
  •   Pascal Thivent    16 年前

    正如您所写的,如果您使用 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 声明。但这是全局设置,不能在实体级别调整此行为。

    5.7. Auxiliary database objects . 根据文件:

    5.7. 辅助数据库对象

    辅助数据库对象允许 数据库对象。结合 Hibernate的模式进化工具, 他们有能力完全定义 Hibernate中的用户模式 映射文件。虽然是设计的 专门用于创建和删除 触发器或存储 java.sql.Statement.execute()方法无效 等等)。基本上有两种模式 用于定义辅助数据库 物体:

    中的CREATE和DROP命令

    <hibernate-mapping>
        ...
        <database-object>
            <create>CREATE TRIGGER my_trigger ...</create>
            <drop>DROP TRIGGER my_trigger</drop>
        </database-object>
    </hibernate-mapping>
    

    类,该类构造 删除命令。此自定义类必须 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

    推荐文章