[SPRING] 스프링 3.1에서 JDO 구성하기
SPRING스프링 3.1에서 JDO 구성하기
나는 모든 DAO가 Spring 3.1에서 사용되지 않는 JdoDaoSupport 클래스를 확장하도록 사용했습니다. PersistenceManagerFactory를 래핑하는 내 자신의 AbstractJdoDao 클래스를 만들었으며 모든 DAO는 여기에서 확장됩니다. 그게 내가해야하는 방식인가?
또한 JDO에 관한 문서에서는 PersistenceManagerFactory의 직접 인스턴스화가 기본 옵션이 아니라 TransactionAwarePersistenceManagerFactoryProxy로 래핑 된 LocalPersistenceManagerFactoryBean을 사용하는 것으로 보입니다. 어떻게이 빈들을 적절하게 인스턴스화하고 Spring의 @Transactional 어노테이션으로 작업하게 만드는지.
내 응용 컨텍스트의 지속성 관련 부분은 다음과 같습니다.
<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>
이제 데이터 저장소에 액세스하는 페이지를로드 할 때 :
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
GitHub에 예제 프로젝트가 있습니다. 그것은 Google App Engine을 사용하고 있기 때문에 mvn gae : Eclipse에서 실행 (Eclipse 용 Google 플러그인 사용)하거나, 먼저 Eclipse 프로젝트를 mvn eclipse : eclipse를 통해 실행하십시오.
해결법
-
==============================
1.제 제안은 Spring 3.1 문서에서 제안한대로 TransactionAwarePersistenceManagerFactoryProxy 또는 SpringPersistenceManagerProxyBean을 사용하는 것입니다. 이것은 JdoDaoSupport 클래스를 대체하도록 설계된 것 같습니다.
제 제안은 Spring 3.1 문서에서 제안한대로 TransactionAwarePersistenceManagerFactoryProxy 또는 SpringPersistenceManagerProxyBean을 사용하는 것입니다. 이것은 JdoDaoSupport 클래스를 대체하도록 설계된 것 같습니다.
자신 만의 AbstractJdoDao 래퍼를 만드는 것에 대한 귀하의 질문에서 제안하는 것은 물론 비추천 경고를 제거하지만 내 유일한 관심사는 우연히 다른 사람들이 사용하지 않는 것처럼 유지하기 어려운 상황을 실수로 만들 수 있다는 것입니다 보고하는 것.
다른 한편으로는, 나는 당신 자신의 래퍼를 만드는 것이 당신의 문제를 해결하는 매우 빠른 방법이라고 생각합니다 ...
스프링 3.1 방식으로 앞으로 나아갈 때의 장점 / 단점을 이용하여 자신의 래퍼를 사용할 때의 장점과 단점을 신중하게 고려해야합니다. 내 경험상, 바로 가기를 사용하는 것은 앞으로도 계속 발생할 수 있으며 때로는 다시 돌아올 수 있습니다.
from https://stackoverflow.com/questions/8853133/configuring-jdo-in-spring-3-1 by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] XML 파일없이 Spring ACL을 설정하는 방법 (0) | 2019.02.11 |
---|---|
[SPRING] Spring 3.0 FileUpload는 POST에서만 사용할 수 있습니까? (0) | 2019.02.11 |
[SPRING] 콩의 조건부 주사 (0) | 2019.02.11 |
[SPRING] Java / Jetty : Embedded Jetty에 필터를 추가하는 방법 (0) | 2019.02.11 |
[SPRING] JAXB 주석이있는 Spring 3.1.2의 등록자 MappingJackson2HttpMessageConverter (0) | 2019.02.11 |