2015-09-22 4 views
1

Я использую spring jpa. Я реализовал управление транзакциями, используяМетод поиска JPA сохраняется данные

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactory" /> 
</bean> 
<tx:advice id="txAdvice" transaction-manager="transactionManager"> 
    <!-- the transactional semantics... --> 
    <tx:attributes> 
     <!-- all methods starting with 'find' are read-only --> 
     <tx:method name="find*" read-only="true" /> 
     <!-- other methods use the default transaction settings (see below) --> 
     <tx:method name="*" rollback-for="Exception" /> 
    </tx:attributes> 
</tx:advice>  

<aop:config> 
    <aop:pointcut id="transactionalServiceOperation" 
     expression="execution(* com.test..*ServiceImpl.*(..))" /> 
    <aop:advisor advice-ref="txAdvice" pointcut-ref="transactionalServiceOperation" /> 
</aop:config> 

Недавно я заметил, что хотя в некоторых случаях управление транзакциями работает, но в других случаях это не так. Например, у меня есть этот кусок кода внутри метода службы, который аннотируется @org.springframework.transaction.annotation.Transactional. Код внутри метода

guardianService.save(newFather); 
parentsSet.add(newFather); 
Guardian oldMother = guardianService.findById(motherId); 

В вышеприведенном случае данные в базе данных не Персис до 3-й линии. Как только приложение завершит выполнение третьей строки, данные newFather будут отправлены в базу данных, даже если приложение генерирует Exception после третьей строки.

Фрагмент кода из guardianService.findById(motherId)

@Override 
public Guardian findById(long guardianId) { 
    return guardianRepository.findByGuardianId(guardianId); 
} 

Внутри GuardianRepository

public interface GuardianRepository extends JpaRepository<Guardian, Long> { 

Guardian findByGuardianId(long id); 
} 

Фрагмент кода из guardianService.save(newFather);

@Override 
@Transactional 
public Guardian save(Guardian guardian) { 
    return guardianRepository.save(guardian); 
} 

Так что мой вопрос делает метод find() как-то называет flush() или commit()?

ответ

4

Метод find() фактически вызывает метод flush. По умолчанию в JPA, FlushModeType установлено значение AUTO, что означает, что при возникновении запроса к базе данных данные в базе данных должны быть актуальными для текущей транзакции. Из определения:

Когда запросы выполняются в рамках транзакции, если FlushModeType.AUTO устанавливается на объекте запроса, или если промывочная установка режима для контекста Настойчивости AUTO (по умолчанию) и режим промывки параметр не был указан для объекта Query, поставщик непрерывности - , отвечающий за то, что все обновления состояния всех объектов в контексте персистентности, которые могут потенциально повлиять на результат запроса, видны для обработки запрос.

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