1

基礎

Spring2.5.6とHibernate3.2.1を使用しています-セットアップを妨害することが許可されていないjboss4.2.3にデプロイする必要があるためです(jbossサーバーはスクリプトによって構築されており、スクリプトは古いがスクリプトが古いため)それを変更するために時間を投資するために与えられたチャーター)。したがって、いいえ、JBoss上のアプリのプライベートライブラリを持つことはできません。

私は、休止状態のXML担当者ではなく、注釈担当者によるJPAです。したがって、DTOとマッピングを休止状態のXMLを使用するように変更するつもりはありません。Hibernate3.6からHibernate3.2.1に回帰しなければならないことは、私にとってすでに多すぎました。エンティティクラスを休止状態で自動検出しましたが、これを変更することはありません。

問題

JBoss 4.2.3devenvでJPAとJAX-RSでうまく動作するWebアプリを作成しました。次に、Spring2.5.6フレームワークに適合させる必要があります。

そこで、次のApplicationContext.xmlを作成しました...

<bean id="propertyPlaceHolder" class="zzz.common.spring.config.ConfigPlaceholderConfigurer" >
    <property name="location" value="file:C:/config/bootstrap.properties"/>
</bean>

<tx:annotation-driven />

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

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

<bean id="entityManagerFactory"
  class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean" >
  <property name="persistenceUnitName" value="obamacare"/>    
</bean>

そしてこれはpersistence.xmlです。元々、プロパティ値は開発中にハードコーディングされていました。しかし、それらを本番環境に変換するには、それらの値を春の${references}にする必要があります。$ {references}はfile:C:/config/bootstrap.propertiesから読み取られ、zzz.common.spring.config.ConfigPlaceholderConfigurerは認証サービスを介してユーザーとパスワードを設定する必要があります。

<persistence-unit name="obamacare" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <!-- Scan for annotated classes and Hibernate mapping XML files -->
    <properties>
        <property name="hibernate.archive.autodetection" value="class, hbm" />

        <property name="hibernate.connection.driver_class"
            value="${zzz.common.sql.ConnectionPool.driverClass}" />
        <property name="hibernate.connection.url"
            value="${zzz.common.sql.ConnectionPool.url}" />

        <property name="hibernate.connection.username" value="${zzz.common.sql.ConnectionPool.user}"/>
        <property name="hibernate.connection.password" value="${zzz.common.sql.ConnectionPool.password}"/>

        <property name="hibernate.dialect" value="org.hibernate.dialect.OracleDialect" />
        <property name="hibernate.show_sql" value="true" />

    </properties>
</persistence-unit>

明らかに、永続XMLのスプリング$ {references}は機能していません。これは、エンティティマネージャーがNullであり、jdbcドライバークラスがnullであるためです。URL、ユーザー、パスワードも同様です。

次の行をJAX-RS応答コードに配置しました。ここで、デバッガーはentityManagerがnullであることを示しています。

@PersistenceContext
private EntityManager entityManager;

質問

Q1。

春の${references}をpersistence.xmlプロパティに挿入するにはどうすればよいですか?

Q2。

persisitence.xmlプロパティをApplicationContext.xmlのデータソースに転送しようとしました。

<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean" >
    <property name="persistenceUnitName" value="unit1"/>    
</bean>

<bean id="dataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">

    <property name="driverClassName" value="${zzz.common.sql.ConnectionPool.driverClass}"/>
    <property name="url" value="${zzz.common.sql.ConnectionPool.url}"/>
    <property name="username" value="${zzz.common.sql.ConnectionPool.user}"/>
    <property name="password" value="${zzz.common.sql.ConnectionPool.password}"/>
</bean>

しかし、JBossの起動が失敗したのは... DriverManagerDataSourceが書き込み可能ではなく、setDatasourceメソッドまたはsetDatasourceメソッドにアクセスできないためです。

DriverManagerDataSourceでデータソースを設定できないのはなぜですか?setDatasourceメソッドを作成するには、拡張クラスで何をする必要がありますか。そのメソッド内で何をする必要がありますか?

setDatasourceを許可する代替のjdbcデータソースを提案できますか?

Q3。

他にやらなければならないことはありますか、それともSpring FrameworkがentitymanagerでPersistenceContextアノテーションを自動的に見つけて、それをインスタンス化しようとしますか?

Q4。

Bean jpaTemplateは何をしますか?なぜ必要なのですか?

Q5。

すべてをApplicationContext.xmlに転送した場合でも、ダミーのプレースホールディングpersistence.xmlを保持する必要がありますか?

私は助けが必要です。DriverManagerDataSourceをApplicationContext.xmlで機能させるか、${references}をpersistence.xmlで機能させることによって。

皆さん、ありがとうございました。

これは、先週私が尋ねた質問のフォローアップです:JPA永続性プロパティを動的に設定します。

4

2 に答える 2

2

Q4JpaTemplate はもう本当に必要ありません。それは廃止されます。

Q5 永続性ユニットが1つしかない場合、Springではpersistence.xmlは必要ありません。LCEMFBプロパティ「packagesToScan」を使用して、エンティティパッケージディレクトリを参照できます。

注:「PersistenceUnit」プロパティは使用しないでください。「PackagesToScan」が上書きされます。

SpringDataJPAについてここでブログを書きました

于 2012-08-19T22:41:22.823 に答える
1

Q1

AFAIKはできません。Springは、プレースホルダー構成を独自の管理されたxmlファイルにのみロードします。

Q2、Q3、Q5

このブログ投稿では、 LocalContainerEntityManagerFactoryBeanを使用してpersistence.xmlを廃止する方法について説明しています。

Q4

この投稿では、 JpaTemplateを使用したくないが、例外変換のSpringの良さなどを取得することについて説明しています。

于 2012-08-16T08:43:14.853 に答える