多模式 DDL 外键生成不适用于 Hibernate

Posted

技术标签:

【中文标题】多模式 DDL 外键生成不适用于 Hibernate【英文标题】:Multi-schema DDL Foreign Key generation not working with Hibernate 【发布时间】:2017-02-15 06:48:43 【问题描述】:

我部署 oracle 数据库并创建 2 个架构

核心 消息

c_user 表在 core 中,我想在 msg 架构中创建 m_message 表。 我的应用结构是:

Core-Project 是一个独立的依赖项,包含在其他项目中,User.hbm.xml 就在其中。 我将 Core-Project 添加到 Message-Projectpom.xmlMessage-ProjectMessage.hbm.xml

我使用休眠 4,我的休眠映射文件如下所示。当我启动我的应用程序(消息项目)时,我想m_message 使用 core 架构中的c_user 表创建外键,但休眠生成的 DDL 是错误的。我认为 hibernate 无法在 User.hbm.xml 中设置不是架构属性的 default_schema 属性!注意。我不想在 User.hbm.xml 中添加架构属性,因为 Core-Project 添加到 10 多个项目中。

Message.hbm.xml 在消息项目中

<class name="org.message.model.Message" table="m_message" schema="msg">
    <many-to-one name="sender" column="sender_Id" entity-name="org.core.model.User" not-null="true" />
    ...
</class>

User.hbm.xml 在核心项目中

<class name="org.core.model.User" table="c_user">
    ...
</class>

oracle-hibernate.properties

hibernate.connection.driver_class=oracle.jdbc.driver.OracleDriver
hibernate.connection.url=jdbc:oracle:thin:@localhost:1521:HRM
hibernate.connection.username=msg
hibernate.connection.password=msg
hibernate.connection.internal_logon=normal
hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
hibernate.hbm2ddl_auto=update
hibernate.default_schema=core

休眠 XML 配置文件

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource_" ref="dataSource_" />
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.default_schema"> $hibernate.default_schema</prop>
            ...
         </props>
     </property>
</bean>

hibernate 为外键生成 DDL,如下所示:

alter table msg.m_message add constraint FK_filpe81gwdf3f6oqn54d5ybh3 
foreign key (sender_Id) references msg.c_user

为什么是msg.c_user?为什么休眠不能为没有模式属性的表设置 default_schema? 我认为使用 default_schema 生成外键的顺序是:

1) 使用User.hbm.xml 的架构,如果不存在则使用 2) 使用Message.hbm.xml 的架构,如果不存在则使用 3) 使用 oracle-hibernate.properties 的 default_schema

如何更改此顺序?非常感谢...

【问题讨论】:

我认为问题在于,您将值传递给属性文件,但它没有加载到您的休眠配置 XML 文件中。试试看这个:***.com/questions/2737420/… @holmicz 感谢重播。但没关系,我的休眠配置 XML 文件中加载了 default_schema。 我不知道你是否在使用 spring,但如果是,请考虑查看此 ***.com/questions/24846636/… 。您是否还尝试将 User.hbm.xml 中的模式设置为核心,只是为了看看它是否有效?并从 message.hbm.xml 中丢弃“msg”架构,看看是否将默认架构放在那里? 我测试了这个场景。当 User.hbm.xml 有一个 'core' 模式,而 Message.hbm.xml 没有 'msg' 模式时,休眠在核心模式中添加消息表,这意味着 default_schema 正在工作。但是使用此属性的顺序不同..! 【参考方案1】:

这很可能是一个错误。但是,即使是这样,它也不会在 Hibernate 4 中修复。

如果您可以使用 Hibernate 5.2 复制它,那么您应该打开一个新的 Jira 问题,该问题将得到修复。

但是,将 HBM​​2DDL 用于您的生产数据库是一个更大的问题。 HBM2DDL 适用于测试和原型设计,不适用于生产环境。您应该使用Flyway 来管理您的数据库架构。

【讨论】:

感谢重播,我用 hibernate 5.2 测试了这个场景,如果存在,那么我会创建问题。你关于环境的句子是正确的。 好的,谢谢。尝试复制问题时请使用our templates。

以上是关于多模式 DDL 外键生成不适用于 Hibernate的主要内容,如果未能解决你的问题,请参考以下文章

在 Mysql 上使用 ddl 模式生成时未生成 ON DELETE CASCADE 选项

NHibernate 级联删除不适用于一对多关联

django 多数据库路由不适用于多个模式

Django覆盖模型get()方法不适用于外键

如何生成 Oracle 模式的整个 DDL(可编写脚本)?

用于禁用约束的 Informix DDL 执行