2013-05-10 2 views
0

Я понял, что после написания этого вопроса я мог подвести итог в нескольких предложениях. Как я могу управлять транзакциями в Spring-Data-JPA с CDI так же, как и с помощью @Transactional в самой весне?Spring Data JPA - Использование @Transactional в среде CDI вместо среды Spring

Первое, что я сделал, было настроено Spring Data 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); 
} 

Тогда я получаю эту ошибку

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

На первом я понял, что я не имел @Transactional поэтому я добавил его и до сих пор не работает. (Я считаю, что весной вам нужно использовать АОП XML-файл, чтобы настроить @Transactional так что имеет смысл это не работает в ЭЭ из коробки, я просто не знаю, как заставить его работать.)

FYI аннотирования с этим не работает

@TransactionAttribute(TransactionAttributeType.REQUIRED) 

Что-то я пробовал, когда писал этот пост, и я получил его на работу ... но мне не нравится код, и мне все еще интересно использовать @Transactinoal, этот код кажется грязным, я довольно sure @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

Если вы запускаете Spring Data в среде CDI, вы совсем не используете контейнер Spring. Поэтому для работы с репозиториями вам нужно будет использовать сеансовые компоненты EJB, поскольку в настоящее время CDI не поддерживает транзакции из коробки. Расширения CDI, поставляемые с Spring Data, в основном обеспечивают точку входа в мир JavaEE, и вы будете использовать стандартные механизмы транзакций, которые вы можете использовать в этой среде.

Таким образом, вы либо вставляете репозиторий в фасоль @Stateless напрямую, либо вводите компонент CDI в один. Это позволит вам использовать аннотации транзакций EJB в EJB.

 Смежные вопросы

  • Нет связанных вопросов^_^