2012-01-13 5 views
7

私はすべてのDAOをdeprecated in Spring 3.1JdoDaoSupportクラスに拡張していました。私は自分のAbstractJdoDaoクラスを作ってPersistenceManagerFactoryをラップし、そこからすべてのDAOが伸びています。それが私のやり方であるか?Spring 3.1でJDOを設定するには?

また、documentation on JDOでは、PersistenceManagerFactoryの直接インスタンス化はデフォルトオプションではなく、をTransactionAwarePersistenceManagerFactoryProxyにラップしているようです。これらのBeanを適切にインスタンス化し、Springの@Transactional注釈で動作させる方法。私はmy example project on GitHubを持って

org.springframework.transaction.CannotCreateTransactionException: Could not open JDO PersistenceManager for transaction; nested exception is java.lang.IllegalStateException: No JDO PersistenceManager bound to thread, and configuration does not allow creation of non-transactional one here 
    at org.springframework.orm.jdo.JdoTransactionManager.doBegin(JdoTransactionManager.java:369) ~[spring-orm-3.1.0.RELEASE.jar:3.1.0.RELEASE] 
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:371) ~[spring-tx-3.1.0.RELEASE.jar:3.1.0.RELEASE] 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:335) ~[spring-tx-3.1.0.RELEASE.jar:3.1.0.RELEASE] 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:105) ~[spring-tx-3.1.0.RELEASE.jar:3.1.0.RELEASE] 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) ~[spring-aop-3.1.0.RELEASE.jar:3.1.0.RELEASE] 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) ~[spring-aop-3.1.0.RELEASE.jar:3.1.0.RELEASE] 
    at $Proxy15.queryAll(Unknown Source) ~[na:na] 
    ... 
Caused by: java.lang.IllegalStateException: No JDO PersistenceManager bound to thread, and configuration does not allow creation of non-transactional one here 
    at org.springframework.orm.jdo.PersistenceManagerFactoryUtils.doGetPersistenceManager(PersistenceManagerFactoryUtils.java:153) ~[spring-orm-3.1.0.RELEASE.jar:3.1.0.RELEASE] 
    at org.springframework.orm.jdo.TransactionAwarePersistenceManagerFactoryProxy$PersistenceManagerFactoryInvocationHandler.invoke(TransactionAwarePersistenceManagerFactoryProxy.java:159) ~[spring-orm-3.1.0.RELEASE.jar:3.1.0.RELEASE] 
    at $Proxy13.getPersistenceManager(Unknown Source) ~[na:na] 
    at org.springframework.orm.jdo.JdoTransactionManager.doBegin(JdoTransactionManager.java:308) ~[spring-orm-3.1.0.RELEASE.jar:3.1.0.RELEASE] 
... 73 common frames omitted 

:私は、データ・ストアにアクセスするページをロードするとき今

<bean id="persistenceManagerFactoryProxy" class="org.springframework.orm.jdo.TransactionAwarePersistenceManagerFactoryProxy"> 
    <property name="targetPersistenceManagerFactory"> 
     <bean class="org.springframework.orm.jdo.LocalPersistenceManagerFactoryBean"> 
      <property name="jdoPropertyMap"> 
       <props> 
        <prop key="javax.jdo.PersistenceManagerFactoryClass">org.datanucleus.store.appengine.jdo.DatastoreJDOPersistenceManagerFactory</prop> 
        <prop key="javax.jdo.option.ConnectionURL">appengine</prop> 
        <prop key="javax.jdo.option.NontransactionalRead">true</prop> 
        <prop key="javax.jdo.option.NontransactionalWrite">false</prop> 
        <prop key="javax.jdo.option.RetainValues">false</prop> 
        <prop key="javax.jdo.option.DetachAllOnCommit">true</prop> 
        <prop key="javax.jdo.option.Multithreaded">true</prop> 
        <prop key="datanucleus.appengine.ignorableMetaDataBehavior">NONE</prop> 
       </props> 
      </property> 
     </bean> 
    </property> 
    <property name="allowCreate" value="false" /> 
</bean> 

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

<bean id="transactionManager" class="org.springframework.orm.jdo.JdoTransactionManager"> 
    <property name="persistenceManagerFactory" ref="persistenceManagerFactoryProxy" /> 
</bean> 

は、ここに私のアプリケーションコンテキストの持続性に関連した部分です。 Google App Engineを使用していますので、mvn gae:run(Eclipse用Google Pluginを使用)でmvn gae:runを実行するか、最初にmvn eclipse:eclipseでEclipseプロジェクトを作成します。

+0

ドキュメントを読んで、私は豆「のTransactionManager」のプロパティ「PersistenceManagerFactoryのは、」Beanを参照すべきであると結論付けて「LocalPersistenceManagerFactoryBean」プロキシの代わりに。あなたの例のように匿名ではなく、そのbeanにidを与える必要があります。 – Luciano

答えて

3

私の提案は、Spring 3.1のマニュアルで示唆しているようにTransactionAwarePersistenceManagerFactoryProxyまたはSpringPersistenceManagerProxyBeanを使用することです。これは、JdoDaoSupportクラスを置き換えるように設計されているようです。

独自のAbstractJdoDaoラッパーを作成することについてのご質問にはもちろん、廃止予定の警告はありませんが、私の唯一の懸念は、間違って他の人が維持できない状況を作成する可能性があることです彼らは何を見て慣れているのですか?

一方、私は自分自身のラッパーを作成する想像すると、あなたの問題を解決するために非常に高速な方法です...

あなたは慎重の長所/短所を使用して独自のラッパーを使用することの利点/欠点を比較検討すべきです物事を行うためのSpring 3.1の方法で前進します。私の経験では、ショートカットを取ることができますし、しばしばあなたの将来を迎えるために戻ってくることができます。

+0

は 'AbstractJdoDao'は、むしろ' PersistenceManagerFactory'より 'TransactionAwarePersistenceManagerFactoryProxy'への参照を持つべきでしょうか? – hleinone

+0

はい、あなたは正しいです。 [Spring 3.1 JDOのドキュメント](http://static.springsource.org/spring/docs/3.1.0.RC1/spring-framework-reference/html/orm.html#orm-jdo)で使用している例-daos-straight)は、TransactionAwarePersistenceManagerFactoryProxyオブジェクトを使用してDaoクラスに注入されたPersistenceManagerFactoryを示します。私はあなたが抽象クラスにそれを注入し、同じものから継承できると思います。ただし、例では抽象クラスを使用していません。ドキュメントによれば、この方法の利点は、あなたがSpringの依存関係を使用していないことです。 – jmort253

+0

問題を[GitHubのプロジェクト](https://github.com/hleinone/spring-gae-jdo)に隔離しました。まだほとんど同じ例外があります。 – hleinone

関連する問題