2016-10-17 3 views
0

안녕하세요. db 작업을 수행하는 동안 예외가 발생합니다.Play Framework - 컨텍스트에서 EntityManager가 없습니다.

java.lang.RuntimeException : 컨텍스트에서 EntityManager를 찾을 수 없습니다. @ play.db.jpa.Transactional

다음

코드가와 액션 메소드에 주석을 시도

paymentResponse.onRedeem(response -> persistTransaction(response, buyerInformation.getCustomerId())); 
paymentResponse.onRedeem(response -> completeProductOrder(response, buyerInformation)); 
paymentResponse.onRedeem(response -> postSuccessfulProcess(response, purchasePayload, buyerInformation)); 
persistTransaction 및 postSuccessfulProcess가 같은 것을 사용하여 DB 업데이트 거래를하고있는

아래

JPA.withTransaction(() -> { 

및 저장할 코드는 다음과 같습니다.

JPA.em().persist(entity); 

ds EntityManager를 맵에서 "default"키로 지정하지만 JPA.em()은 실제로 currentEntityManager라는 이름의 EntityManager를 찾습니다. JPA.em ("default")을 사용하려고했지만 연결 시간 초과가 발생합니다.

프레임 워크를 처음 사용했습니다. 이 문제에 대한 해결책을 제안 해 주시겠습니까?

+0

관련 질문에 내 답변 [] (http://stackoverflow.com/a/32443893/1195766)을 참조하십시오. 특히, 간단한 예제를 통해 요지를 살펴보십시오. https://gist.github.com/dzagorovsky/b8064c97ba647ed453ab – dzagorovsky

답변

0

재생 2.5부터 시작 전역 개체 JPA는 더 이상 사용되지 않으며 대신 JPAApi를 사용해야합니다. JPAApi는 어딘가에 주입해야합니다. 난 당신의 코드, 나는 그것을 주입을 위해 제안 할 수있는 간단한 방법의 작은 조각을 볼 수 있기 때문에 다음과 같이이다 :

JPAApi jpa = Play.current().injector().instanceOf(JPAApi.class); 

지금 당신이 그것을 사용할 수 있습니다

jpa.withTransaction(() ->... 

또는

jpa.em().persist(entity); 

원인은 @ 삽입 주석으로 주입하는 것이 가장 좋습니다.

post에서 Play 2.5부터 시작하는 JPA 사용의 차이점에 대해 자세히 알아볼 수 있습니다.

+0

'Play.current()'와 같은 전역 상태를 사용하는 것은 좋지 않습니다.'JPAApi'를 직접 삽입하는 것이 좋습니다. 더 나은 접근 방법이 될 것입니다. –

+0

@PR 그것이 언급 된 이유는 무엇입니까? – asch

+0

관리 빈 (Guice 또는 기타)에서 JPAApi가 필요하다면 직접 주입 할 수 있습니다. 그렇지 않으면 우리는 그 객체를 초기화하는 동안 (jpaapi를 사용해야하는 곳) 또는 정적 주입 '또한 추천하지 않습니다. Play 2.5에서는 모든 것이 DI를 통해 이루어져야합니다. –