2013-05-10 3 views
0

이 글을 쓰고 나면 몇 문장으로 요약 할 수 있습니다. Spring 자체에서 @Transactional을 사용하는 것과 같은 방법으로 CDI로 Spring-Data-JPA에서 트랜잭션을 관리 할 수 ​​있습니까?스프링 데이터 JPA - 스프링 환경 대신 CDI 환경에서 @Transactional 사용

내가했던 첫 번째 일은 여기에 문서를 기반으로하는 스프링 데이터 JPA CDI를 설정했다.

http://static.springsource.org/spring-data/data-jpa/docs/current/reference/html/jpa.repositories.html#jpd.misc.cdi-integration 나는이를 설정하고 읽기 작업을 위해 잘 작동하지만, 작업

예를 들어, 문서에있는 이들의 예는 잘 작동 할 쓰기되지 않습니다.

List<Person> people = repository.findAll(); 

기본 설정이 완료되었습니다.

손으로 쓴 것이 오타 일 수 있습니다. 이것은 내가 실행 한 코드와 유사합니다. 그런 다음

@Inject 
UserRepository userRepository; 

User user; 

@Transactional 
public void signUpUserAction() { 
    userRepository.saveAndFlush(user); 
} 

나는 내가 @Transactional이 없었 실현이 오류를 먼저

Caused by: javax.persistence.TransactionRequiredException: no transaction is in progress 

를받을 그래서 나는 그것을 추가하고 여전히 작동하지 않았다. (나는 봄을 믿는 당신은을 사용할 필요가 그것은이 상자 밖으로 EE에서 작동하지 않습니다 의미가 있도록 AOP XML 파일은 @Transactional을 설정, 난 그냥 작동하도록하는 방법을 모르겠어요.)

가 참고로이 함께 주석 이 작동하지 않습니다

@TransactionAttribute(TransactionAttributeType.REQUIRED) 

내가이 게시물을 쓰는 동안 뭔가 해봤지만 일종의 작업을했는데 코드가 마음에 들지 않고 @Transactinoal 사용에 관심이 많다.이 코드는 더러워졌고, 나는 예쁘다. @Transactional은이 코드가 유효하지 않은 동안 깨끗한 방식으로 트랜잭션 방식 인 다른 메소드를 호출합니다.

저장하고 데이터베이스에 있는지 확인합니다.

@Inject 
EntityManager em; 

@Inject 
UserRepository userRepository; 

private User user; 

public void signUpUserAction() { 
    em.getTransaction().begin(); 
    userRepository.saveAndFlush(user); 
    em.getTransaction().commit(); 
} 

간단히 말해, 트랜잭션을 관리하기 위해 @Transactional 또는 비슷한 것을 어떻게 사용할 수 있습니까?

도움 주셔서 감사합니다.

+0

내가 말할 수있는 한 최선을 다해 봄 데이터는 여전히 스프링 빈을 사용하여 끝나기를 기대합니다. CDI로 작업하는 경우에도 마찬가지입니다. CDI 통합은 단순히 생산자 방법을 제공하는 것입니다. –

답변

2

CDI 환경에서 스프링 데이터를 실행하면 스프링 컨테이너가 전혀 실행되지 않습니다. 따라서 CDI는 현재 상자 밖의 트랜잭션을 지원하지 않으므로 저장소와 함께 작동하려면 EJB 세션 빈을 사용해야합니다. Spring Data와 함께 제공되는 CDI 확장은 기본적으로 JavaEE 환경에 진입 점을 제공하며, 해당 환경에서 사용할 수있는 표준 트랜잭션 메커니즘을 사용합니다.

그래서 @Stateless 빈에 저장소를 직접 주입하거나 CDI 빈을 주입합니다. 그러면 EJB에서 EJB 트랜잭션 주석을 사용할 수 있습니다.

관련 문제