多模式 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
表。
我的应用结构是:
User.hbm.xml
就在其中。
我将 Core-Project 添加到 Message-Project 的 pom.xml
。 Message-Project 有Message.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 生成外键的顺序是:
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 问题,该问题将得到修复。
但是,将 HBM2DDL 用于您的生产数据库是一个更大的问题。 HBM2DDL 适用于测试和原型设计,不适用于生产环境。您应该使用Flyway 来管理您的数据库架构。
【讨论】:
感谢重播,我用 hibernate 5.2 测试了这个场景,如果存在,那么我会创建问题。你关于环境的句子是正确的。 好的,谢谢。尝试复制问题时请使用our templates。以上是关于多模式 DDL 外键生成不适用于 Hibernate的主要内容,如果未能解决你的问题,请参考以下文章