不使用Hibernate的多模式DDL外键生成

时间:2017-02-15 06:48:44

标签: java hibernate orm schema hibernate-mapping

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

  • MSG

c_user表位于核心中,我想在 msg 架构中创建m_message表。
我的申请结构是:

  • Core-Project ,它是一个独立的依赖项,包含在其他项目中,User.hbm.xml就在其中。
  • 我将核心项目添加到消息项目pom.xml消息项目Message.hbm.xml

我使用hibernate 4,我的hibernate映射文件就像下面的东西。当我启动我的应用程序(Message-Project)时,我想用m_message创建具有核心模式的c_user表的外键,但是hibernate生成的DDL是错误的。我认为hibernate不能在User.hbm.xml中设置不是schema属性的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

hibernate 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?为什么hibernate不能为没有schema属性的表设置default_schema?
我认为使用default_schema生成外键的顺序是:

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

我该如何更改此订单?非常感谢...

1 个答案:

答案 0 :(得分:2)

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

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

但是,依赖于生产数据库的HBM2DDL更是一个问题。 HBM2DDL适用于测试和原型设计,不适用于生产环境。您应该使用FlywayDB来管理数据库架构。