我在我的项目中使用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">
但问题是我根据不同的环境有不同的架构名称。那么如何将其配置为编程。
答案 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);
}