Я использую 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()
?