使用spring

时间:2017-12-20 09:36:21

标签: java spring hibernate hibernate-mapping

我在我的项目中使用spring + hibernate + oracle。我将LocalSessionFactoryBean作为会话工厂对象,并将不同的hbm.xml文件映射到我的项目中。

我的配置如下:

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="mappingResources">
            <list>
                <value>one.hbm.xml</value>
                <value>two.hbm.xml</value>
                <value>three.hbm.xml</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">....</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.connection.release_mode">after_transaction</prop>
                <prop key="hibernate.transaction.auto_close_session">true</prop>
                <prop key="hibernate.hbm2ddl.auto">none</prop>
            </props>
        </property>
    </bean>

现在我有三个映射文件,每个都引用不同的模式。因此,为了映射模式名称,我可以在每个映射文件中提供名称,如:

<hibernate-mapping schema="one">

但问题是我根据不同的环境有不同的架构名称。那么如何将其配置为编程。

3 个答案:

答案 0 :(得分:0)

不要在hibernate config xml文件中提供架构名称。根据您的不同环境需求创建单独的.properties文件。并根据环境使用它们。 像这样的东西......

<session-factory>
    <!-- Database connection settings -->
    <property name="driverClassName" value="#{db['driverClassName']}"></property>
    <property name="url" value="#{db['url']}"></property>
    <property name="username" value="#{db['username']}"></property>
    <property name="password" value="#{db['password']}"></property>

</session-factory>

答案 1 :(得分:0)

you can provide the schema name inside the entity and it will work for oracle db Entity "Account" in schema "ABC" 
@Entity
@Table(name="ACCOUNT",schema="ABC")  
class ACCOUNT{
...
}
Entity "CUSTOMER" in schema "XYZ"
@Entity
@Table(name="CUSTOMER",schema="XYZ")  
class CUSTOMER{
...
}

答案 2 :(得分:0)

我通过在构建映射时修改spring配置解决了这个问题。

我通过扩展org.springframework.orm.hibernate4.LocalSessionFactoryBean创建了一个自定义本地会话工厂,并添加了以下方法。

protected SessionFactory buildSessionFactory(LocalSessionFactoryBuilder sessionFactoryBuilder) {
    try {
        sessionFactoryBuilder.buildMappings();
        Iterator<Table> iterator = getConfiguration().getTableMappings();
        while (iterator.hasNext()) {
            Table table = iterator.next();
            if (table.getSchema() != null && !table.getSchema().isEmpty()) {
                table.setSchema(mySchemaName);
            }
        }
    } catch (Exception ex) {
        logger.error("Exception occurred while building mapping: ", ex);
    }
    return super.buildSessionFactory(sessionFactoryBuilder);
}