2017-12-20 6 views
1

私のプロジェクトではspring + hibernate + oracleを使用しています。セッションファクトリオブジェクトとしてLocalSessionFactoryBeanを持っていて、別のhbm.xmlファイルをプロジェクトにマップしました。Springで休止状態マッピングファイルにスキーマ名を動的に追加

私の構成は以下の通りです:

<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> 

は今、私は3つのマッピングファイルがあり、それぞれが異なるスキーマを参照してください。だから、スキーマ名をマップするために、私は次のように各マッピングファイルに名前を提供することができます。

<hibernate-mapping schema="one"> 

しかし、問題は、私は別の環境に基づいて、異なるスキーマ名を持っています。だから私はそれをプログラム的に構成することができます。

答えて

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> 

+0

状況は、私は1つのセッションの工場とデータ・ソースのみを持っていると私はそれから他のスキーマのプライマリおよびアクセス表などのスキーマを持っています主スキーマ。 – Chintan

+0

あなたのケースではどのデータベースを使用していますか? – globetrotter

+0

私はoracleデータベース – Chintan

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{ 
... 
} 
+0

でも動作しますが、別の環境(dev、qa)でスキーマ名としてハードコードしたくない。例えばローカルのスキーマ名は1つですが、qaではone_1で、xmlベースのハイバネートマッピングを使用しています。 – Chintan

+0

あなたはmaven complaintプロジェクトを使用していますか?はいの場合は、プロファイルを作成してエントリを定義することができます。 env configとビルド方法に焦点を当てることをお勧めします。 env変数にコード内でそれらを使用するように指定することができます。 – globetrotter

+0

私はgradleを使用していますが、あなたの提案した方法で試してみて、同じように更新してください – Chintan