При сохранении записи в Бд постоянно происходят rollback. Вижу, что сущность сохранилась(получаю ее id). Но в базе этой сущности не оказывается. Может я как-то не так использую аннотацию @Transactional
?
Dao:
public abstract class AbstractDao<T extends BaseEntity> implements BaseDao<T>{
protected static HibernateUtils utils = HibernateUtils.getInstance();
public long save(T entity) {
Session session = utils.getSession();
long id = (long) session.save(entity);
return id;
}
Service:
@Service
@Transactional(rollbackFor = DaoException.class)
public class BillServiceImpl implements BillService {
@Autowired
private BillDaoImpl billDao;
@Override
public long save(Bill entity) {
try {
return billDao.save(entity);
} catch (DaoException dao) {
throw new ServiceException();
}
}
}
Web:
@RestController
public class AppController {
@Autowired
private BillService billService;
@RequestMapping("/billsave")
public void billsave(ModelAndView modelAndView){
Bill bill = new BillBuilder
.BillEntityBuilder()
.password("1234567890")
.build();
long id = billService.save(bill);
System.out.println(id);
}
}
Есть такое понятие - Container-Managed Transactions (CMT
). Оно описывает процесс управления работой с БД, при котором контейнер, в котором работает ваше приложение (например, сервер приложений или фреймворк Spring
), осуществляет контроль действий с БД - выдача вашему приложению соединений с БД, управление транзакциями и прочее. Аннотация @Transactional
"работает" только если у вас настроено и используется CMT.
Наличие этой строчки - Session session = utils.getSession()
- говорит о том, что скорее всего, ваше приложение само осуществляет процесс создания соединения с БД. В таких случаях контейнер не контролирует действия, выполняемые с полученным соединением с БД (сессией), а аннотация @Transactional
игнорируется. Вам следует либо явно подтверждать завершение транзакции вызовом соответствующего метода, либо разбираться с настройкой CMT
в вашем проекте.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
У меня тест который должен проверять выброс Exception, но не смотря на то что в StackTrace он попадает, выражение @Test(expected = PSQLExceptionclass) на него не реагирует:
Код, через который можно узнать время прошедшее со старта JVM таков:
Лабораторная работа в универеДелаю всё по примеру, но при использовании БД для сохранения данных класса SQLiteOpenHelper программа крашится в эмуляторе...