Это работает так, потому что вы пометили транзакцию как только для чтения с @Transactional(readOnly = true)
.
Как видите, это не делает ваши транзакции доступными только для чтения, так как вы можете сохранить изменения, вызвав flush()
вручную.Однако он отключает автоматическую очистку в конце транзакции, поэтому изменения не сохраняются без ручной очистки.
Вам необходимо либо удалить readOnly
из аннотации на уровне класса, либо переопределить ее для не только для чтенияметоды с аннотациями уровня метода:
@Override
@Transactional(readOnly = false)
public boolean save(User user) { ... }
Также обратите внимание, что разграничение транзакций обычно применяется к методам уровня обслуживания, а не к методам DAO.В частности, при написании методов DAO вы на самом деле не знаете, какие транзакции должны быть только для чтения, а какие нет.Эта информация доступна только при разработке сервисного уровня, как вы можете видеть в следующем примере:
public class UserService {
@Autowired UserDAO dao;
@Transactional(readOnly = true)
public User getUserById(int id) {
return dao.getById(id); // getById() can participate in effectively read-only transaction
}
@Transactional
public void changeUserName(int id, String newName) {
User u = dao.getById(id); // Or not
u.setName(newName); // Change will be flushed at the end of transaction
}
}