2013-09-17 2 views
4

Использование Spring Data JPA У меня есть следующий поток внутри той же самой транзакции (REQUIRES_NEW):Вставить после удаления одной транзакции в Spring Data JPA

  1. Удалить набор предсказаний пользователя с этим методом хранилища Spring Data JPA.

    @Query(value = "DELETE FROM TRespuestaUsuarioPrediccion resp WHERE resp.idEvento.id = :eventId AND resp.idUsuario.id = :userId") 
    @Modifying 
    void deleteUserPredictions(@Param("userId") int userId, @Param("eventId") int eventId); 
    
  2. Включить предсказания нового пользователя и сохранить главный объект (событие).

    eventRepository.save(event); 
    

Когда эта служба заканчивается, коммит производится АОП, но работает только в первой attemp ... не в ближайшие из них ...

Как я могу справиться с этой ситуацией, не итерация над записями предсказаний события и обновляя каждый из них внутри?

UPDATE

Я пытался с этим, и он не работает (адаптер вставляет объекты я смывать перед):

@Transactional(propagation=Propagation.REQUIRES_NEW, rollbackFor=PlayTheGuruException.class) 
private void updateUserPredictions(final TUsuario user, final TEvento event, final SubmitParticipationRequestDTO eventParticipationRequestDTO) 
{ 
    eventRepository.deleteUserPredictions(user.getId(), event.getId()); 
    EventAdapter.predictionParticipationDto2Model(user, event, eventParticipationRequestDTO); 
    eventRepository.save(event); 
} 
+0

Как насчет этой части «совершение совершается АОП»? Я не понимаю. – TheKojuEffect

+0

Я подразумеваю, что транзакция начинается непосредственно перед запуском метода, потому что я отмечен как транзакционный (REQUIRES_NEW) и заканчивается, когда выполняется оператор последнего метода. Извините Если я ошибаюсь ... –

+0

Как упоминалось в этом ответе на аналогичный вопрос [http://stackoverflow.com/a/37030089/4261642](http://stackoverflow.com/a/37030089/4261642), там это открытый билет по этой проблеме: [https://jira.spring.io/browse/DATAJPA-727](https://jira.spring.io/browse/DATAJPA-727) – maniacmic

ответ

0

Вы можете решить эту проблему путем введения нового метода @Transactional выполняя обе задание.

@Transactional 
public void deleteAndSave(/*...*/) { 
    deleteUserPredictions(/*...*/); 
    eventRepository.save(event); 
} 
+0

Извините, но это не работает , Вы можете увидеть пример, который я использовал в моем обновлении вопроса. –

1

Hibernate изменил порядок команд. Он работает в ниже порядке: Выполнить все обновления SQL и кэш второго уровня, в особом порядке, так что ограничения внешнего ключа не может быть нарушено:

1. Inserts, in the order they were performed 
    2. Updates 
    3. Deletion of collection elements 
    4. Insertion of collection elements 
    5. Deletes, in the order they were performed 

И это именно тот случай. При промывке Hibernate выполняет все вставки перед операциями удаления. Возможная опция:
1. Вызывать сущностьManager.flush() явно после удаления. OR 2. По возможности обновляйте существующие строки и создайте список ToBeDeleted List. Это обеспечит обновление существующих записей новыми значениями и сохранением полностью новых записей.

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

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