2016-11-06 19 views
0

私は現在、アプリケーション内のすべてのトランザクションに対して1つのスキーマ(SCHEMAADMIN)をデータベース内に使用しています。複数のスキーマ設定Spring MVC + Hibernate + JPA

私の会社はデータベース管理を再構築しており、すべてのアプリに読み書き用のスキームが1つ必要であり、現在使用しているメインスキーマ(SCHEMAADMIN)にのみreadonly/SELECTを許可します。だからここ

は、新しいスキーマが同じデータベース/ URLである私data.xmlのファイルは、その後、これはconfig.propertiesファイルで、

<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:context="http://www.springframework.org/schema/context" 
xmlns:tx="http://www.springframework.org/schema/tx" 
xmlns:jdbc="http://www.springframework.org/schema/jdbc" 
xmlns:jpa="http://www.springframework.org/schema/data/jpa" 
xsi:schemaLocation=" 
    http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd 
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context.xsd 
    http://www.springframework.org/schema/tx 
    http://www.springframework.org/schema/tx/spring-tx.xsd 
    http://www.springframework.org/schema/jdbc 
    http://www.springframework.org/schema/jdbc/spring-jdbc.xsd 
    http://www.springframework.org/schema/data/jpa 
    http://www.springframework.org/schema/data/jpa/spring-jpa.xsd"> 

<jpa:repositories base-package="org.portal.data.repository" /> 

<tx:annotation-driven /> 

<bean id="transactionManager" 
    class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactory"/> 
</bean> 

<bean id="entityManagerFactory" 
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
      <property name="database" value="${database.database}"/> 
      <property name="databasePlatform" value="${database.databasePlatform}"/> 
      <property name="showSql" value="${database.showSql}"/> 
      <property name="generateDdl" value="${database.generateDdl}"/> 
     </bean> 
    </property> 
    <property name="packagesToScan" value="org.portal.entity"/> 
</bean> 

<bean class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" id="dataSource"> 
    <property name="driverClassName" value="${database.driverClassName}" /> 
    <property name="url" value="${database.url}" /> 
    <property name="username" value="${database.username}" /> 
    <property name="password" value="${database.password}" /> 
    <property name="testOnBorrow" value="true" /> 
    <property name="testOnReturn" value="true" /> 
    <property name="testWhileIdle" value="true" /> 
    <property name="timeBetweenEvictionRunsMillis" value="1800000" /> 
    <property name="numTestsPerEvictionRun" value="3" /> 
    <property name="minEvictableIdleTimeMillis" value="1800000" /> 
    <property name="initialSize" value="1" /> 
    <property name="maxActive" value="50" /> 
    <property name="maxIdle" value="20" /> 
</bean> 

ある

# database general setting 
database.database=ORACLE 
database.databasePlatform=org.hibernate.dialect.Oracle10gDialect 
database.showSql=false 
database.generateDdl=false 
database.driverClassName=oracle.jdbc.driver.OracleDriver 

# DEVELOPMENT local 
http://localhost:8080 
database.url=jdbc:oracle:thin:@192.168.1.1/orcl 
database.username=schemaadmin 
database.password=password 
security.login.callbackUrl=http://localhost:8080/security/callback 

ユーザー名とパスワードは異なります。私はこのファイルのどこに/どのように接続するのか混乱しています。 Googleを介していくつかの情報を読むが、私は今実際に混乱している。

アドバイスをしてください。ありがとうございました。

答えて

1

新しいスキーマは同じデータベース/ URLにありますが、別のユーザー名が であり、パスワードが同じです。 I

Oracleでは、スキーマとユーザーは密接に関連しています。

あなたの設定がJava EEデータソースに依存しないため、私はJTAソリューションを提案しません。
この変更に対処するには、読み取り専用ユーザー/スキーマ用と読み取り/書き込みユーザー/スキーマ用の2つのデータソースセット/ entityManagerfactory/transactionmanagerを検討する必要があります。 もちろん、共通の構成をプロパティに組み込むことができます。 (私が要因のプロパティの重複しませんでしたが、あなたがすべき)あなたのアイデアを与えることを

は、私はあなたのxmlのconfを変更し、私は仕事を開始しました:ため...

xmlns:context="http://www.springframework.org/schema/context" 
xmlns:tx="http://www.springframework.org/schema/tx" 
xmlns:jdbc="http://www.springframework.org/schema/jdbc" 
xmlns:jpa="http://www.springframework.org/schema/data/jpa" 
xsi:schemaLocation=" 
    http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd 
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context.xsd 
    http://www.springframework.org/schema/tx 
    http://www.springframework.org/schema/tx/spring-tx.xsd 
    http://www.springframework.org/schema/jdbc 
    http://www.springframework.org/schema/jdbc/spring-jdbc.xsd 
    http://www.springframework.org/schema/data/jpa 
    http://www.springframework.org/schema/data/jpa/spring-jpa.xsd"> 

<jpa:repositories base-package="org.portal.data.repository" /> 

<!-- The original declaration is no longer valid --!> 
<tx:annotation-driven transaction-manager="transactionManagerRead" /> 

<bean id="transactionManagerRead" 
    class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactoryRead"/> 
</bean> 

<bean id="transactionManagerReadWrite" 
    class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactoryReadWrite"/> 
</bean> 

<bean id="entityManagerFactoryRead" 
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="dataSource" ref="dataSourceRead" /> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
      <property name="database" value="${database.database}"/> 
      <property name="databasePlatform" value="${database.databasePlatform}"/> 
      <property name="showSql" value="${database.showSql}"/> 
      <property name="generateDdl" value="${database.generateDdl}"/> 
     </bean> 
    </property> 
    <property name="packagesToScan" value="org.portal.entity"/> 
</bean> 
<bean id="entityManagerFactoryReadWrite" 
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="dataSource" ref="dataSourceReadWrite" /> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
      <property name="database" value="${database.database}"/> 
      <property name="databasePlatform" value="${database.databasePlatform}"/> 
      <property name="showSql" value="${database.showSql}"/> 
      <property name="generateDdl" value="${database.generateDdl}"/> 
     </bean> 
    </property> 
    <property name="packagesToScan" value="org.portal.entity"/> 
</bean>  

そしてそう

トリッキーな問題は、春の構成でしかしあり:

<tx:annotation-driven/> 

それはデフォルトでtransactionManagerという名前のトランザクション・マネージャーBeanを使用しています。私がやったように、あなたがトランザクションマネージャのいずれかでそれを設定する必要があります

<tx:annotation-driven transaction-manager="transactionManagerRead" /> 

を次に、あなたの処理に適したトランザクションマネージャを適用するために、あなたはtransactionManager読み取りまたは書き込みを読んで(使用するように春のサービスに指定する必要があります)。また、デフォルトで使用されるプライマリtransactionManagerを定義することもできます。セキュリティによって、制限が最も多いtransactionManagerにする必要があります。

もちろん
@Transactional(transactionManager="TransactionManagerRead") 
public class CustomerSearchService(){ 
... 

、あなたはメソッドレベルでのトランザクションマネージャを定義することができます。

たとえば、あなただけ読んでください春サービスビーンでは、あなたはクラスが読み取り専用のトランザクションマネージャを使用することを宣言することができ。
しかし、理想的には、ほとんどの方法が書面と読み込みであれば、クラスを再設計したり並べ替えて読み取り専用メソッドと書き込みメソッドを集めることができるかどうかを確認する必要があります。よりメンテナンスが容易でエラーを起こしにくいでしょう。

関連する問題