如何在运行时更改 Hibernate 的 SessionFactory 的默认架构设置?

Posted

技术标签:

【中文标题】如何在运行时更改 Hibernate 的 SessionFactory 的默认架构设置?【英文标题】:How can I change Hibernate's SessionFactory's default schema setting at runtime? 【发布时间】:2016-08-05 05:34:30 【问题描述】:

我们在 XML 中配置我们的会话工厂 bean。默认会话名称是从代码资源文件夹中的属性文件中读取的。出于新的目的,我需要能够在运行时将默认模式属性更改为其他内容。我不知道怎么做。

会话工厂在 XML 连接中创建如下:

   <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.default_schema">$oracle.default_schema</prop>
            <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
            <prop key="hibernate.generate_statistics">false</prop>
            ... other properties ...
        </props>
    </property>
    ... lots of mapping files and annotated classes ...

我想我可以将会话工厂从 Spring 的上下文中拉出来,也许提供一个 Properties 类来(我希望)覆盖默认的会话属性而不是其他任何东西,然后愉快地继续前进。

不幸的是,当我尝试从上下文中获取会话工厂 bean 时,它的类型是 SessionFactoryImpl 而不是 AnnotationSessionFactoryBean。这意味着我无法使用setHibernateProperties() 方法。

我也不确定是否可以致电ALTER SESSION。因为会话工厂是由我们在库中的 DAO 类获得的,所以我没有一种简单的方法来用必要的代码包装会话工厂。

有什么想法吗?

【问题讨论】:

【参考方案1】:

创建多个 JPA 配置文件,为您要支持的每个环境创建一个,然后将其导入到您的 spring 配置中。

<import resource="classpath:services-environment-$environment.name.xml"/>

对我来说,有一个用于 prod、test 和每个用户的文件,通过设置 environment.name 系统属性,加载了正确的 JPA 配置。

【讨论】:

以上是关于如何在运行时更改 Hibernate 的 SessionFactory 的默认架构设置?的主要内容,如果未能解决你的问题,请参考以下文章

使用SQLQuery 在Hibernate中使用sql语句

Hibernate中Session的load()和get()方法如何使用,举列子说明

更改分组时Hibernate中查询的不同返回类型

如何在应用程序启动时从 java 代码更改 Hibernate connection.url 属性

hibernate中一种导致a different object with the same identifier value was already associated with the sess

如何强制 Hibernate 在其实体之一发生更改时不将更改传播到数据库