2013-07-04 2 views
0

GWT 2.5.1 + Spring 3.2 + Hibernate 4 프로젝트에서 작업하고 있습니다. Spring-Hibernate 애플리케이션은 이미 작동하고 있으며 일반적인 Service/Dao 레이어를 가지고있다. 트랜잭션은 서비스 메소드에서 @Transactional 어노테이션을 통해 Spring에 의해 처리됩니다.GWT RequestFactory 및 Spring 관리 트랜잭션

GWT RequestFactory를 사용하여 GWT 레이어를 추가하려고합니다. 특히 RequestFactory와 Spring 관리 트랜잭션이 함께 작동하는 방식을 이해하지 못합니다.

RequestFactory는 실제로 요청한 서비스 메소드를 호출하기 전후에 많은 쿼리 (Locator 클래스의 find/getId 메소드 참조)를 수행하는 것처럼 보입니다. BTW : Locator는 이러한 쿼리를 수행하기 위해 Spring 서비스 빈에 의존해야합니까? 나는 그렇게 생각한다.

이것은 RequestFactory가 다른 트랜잭션에서 일을하는 것을 의미하며 이는 나쁘다. 나는 Hibernate 캐시를 이용하기 위해서 같은 트랜잭션 내에서 전체 요청을 원한다. (이것은 단지 주된 이유이다). ...

내가 @Transactional 주석 어떻게 든 GWT 서버 계층까지 이동해야한다고 생각하지만,이 일을하기 위해 Spring 빈에 있어야합니다, 그래서

무엇 GWT RequestFactory를 통합 할 수있는 가장 좋은 방법이고 스프링 관리 트랜잭션?

답변

0

토마스입니다. 뷰에서 열린 세션을 사용해야합니다.

그냥 당신의 web.xml이 추가 :

<filter> 
    <filter-name>Spring OpenEntityManagerInViewFilter</filter-name> 
    <filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter 
    </filter-class> 
    <init-param> 
     <param-name>entityManagerFactoryBeanName</param-name> 
     <param-value>entityManagerFactory</param-value> 
    </init-param> 
</filter> 
<filter-mapping> 
    <filter-name>Spring OpenEntityManagerInViewFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

@Transactional와 서비스 클래스 나 메소드를 주석 Spring 통합에 대해서.

+0

그리고 ServiceLocator 그 서비스는 봄부터로드된다. –

+0

감사합니다. 올바르게 작동합니다. RequestFactory-Spring 통합에 관해서 ... 몇 가지 작업 솔루션을 찾았습니다 : 1) http://jsinghfoss.tumblr.com/post/18216239637/gwt-2-2-0-requestfactory-spring -3-0-x- 통합 2) https://groups.google.com/forum/#!msg/google-web-toolkit/IQInsMnPtT0/PNU41isLLnUJ (두 번째 게시글) 확실하지 않습니다. 보다 나은. 두 번째 것은 더 간단하지만 매번 ApplicationContext를 가져와야합니다. – Ivan

+0

어쨌든 기본적인 아이디어는 다음과 같습니다. 1) 맞춤 ServiceLayerDecorator가 GWT의 RequestFactoryServlet 생성자에 제공됩니다. 2) 데코레이터는 Spring 관리 빈인 EntityLocators (Locator 인터페이스)와 ServiceLocators를 검색한다. 3) ServiceLocator가 1 개만 필요합니다. Spring 서비스 빈 검색에 대한 책임. 4) 도메인 엔티티의 구현 방법에 따라 적어도 하나의 EntityLocator가 필요합니다. 5) EntityLocatord는 JPA EntityManager (또는 Hiberante SessionFactory)를 직접 사용합니다. ... 위 필터를 추가하면 모든 항목이 삭제됩니다. :) – Ivan

0

나는 봄 통합 말할 수는 없지만, RequestFactory는 기대 :

  • 하나의 세션을 요청에 따라, 일명 "보기에서 열려 세션을"(그래서 같은 하이버 네이트 캐시는 요청 전반에 걸쳐 사용되는)
  • 한 서비스 당 하나의 트랜잭션

따라서 귀하의 포인트는 약 입니다. "RequestFactory는 다른 트랜잭션에서 일을 잘 못합니다. 나는 Hibernate 캐시를 이용하기 위해서 같은 트랜잭션 내에서 전체 요청을 원한다. "은 부적절하고 잘못되었다.

+0

올바른 방향으로 가리켜 주셔서 감사합니다. 공식 문서에이 내용이 설명되어 있지 않은데 놀랍습니다. – Ivan

+0

예, 알고 있습니다 ... 영감을 얻은 경우 http://gwtproject.org/makinggwtbetter.html (추적 프로그램에 버그가 있음)에 대한 패치를 보내주십시오. –

관련 문제