为 LocalSessionFactoryBean mappingLocations 指定正则表达式

Specify a regular expression for LocalSessionFactoryBean mappingLocations

在我的应用程序中,我指定了以下配置以自动获取类路径中特定文件夹下的所有 HBM 文件。

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
  <property name="mappingLocations">
    <list>
      <value>classpath:hbms/**/*.hbm.xml</value>
    </list>
  </property>
</bean>

现在,对于一个新需求,需要创建多个 HBM 文件,其中包含特定于数据库的命名查询。 HBM 文件名的格式为 test.DB.hbm.xml。例如,test.oracle.hbm.xmltest.db2.hbm.xml。除了这些,在同一个文件夹中还有名称格式为 table1.hbm.xml、table2.hbm.xml 等的旧的常规 HBM 文件(用于映射到表)。

使用上述模式,由于新 hbm 文件中的重复命名查询(因为所有此类文件中的名称都相同),文件的休眠加载失败。

现在的要求是加载常规 HBM 文件以及数据库特定的 HBM 文件。是否可以通过使用如下正则表达式来实现?

classpath:hbms/**/*.(.${dbType}).hbm.xml

在上面的示例中,dbType 可用作 Spring 环境 属性。我对这些更改的尝试导致 none 的 HBM 文件被加载(包括旧文件)。

我是不是在使用正则表达式做错了什么,还是无法通过 XML 配置来做到这一点?

谢谢。

您有两个选择:

  1. 您可以将每个数据库特定的配置文件存储在单独的文件夹中,然后您的配置如下所示:

    classpath:hbms/**/${dbType}/*.hbm.xml
    
  2. 您可以让它们遵循您提供的模式,但将配置更改为

    classpath:hbms/**/*${dbType}.hbm.xml
    

要加载常用文件,您需要重命名它们以包含您可以匹配的内容,例如:

one.hbm.xml

成为:

common-one.hbm.xml

那么配置可能如下所示:

    classpath:hbms/**/common-*.hbm.xml
    classpath:hbms/**/*${dbType}.hbm.xml