Rollback происходит автоматически при сохранении сущности в БД

245
17 мая 2017, 06:28

При сохранении записи в Бд постоянно происходят 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);
}
}
Answer 1

Есть такое понятие - Container-Managed Transactions (CMT). Оно описывает процесс управления работой с БД, при котором контейнер, в котором работает ваше приложение (например, сервер приложений или фреймворк Spring), осуществляет контроль действий с БД - выдача вашему приложению соединений с БД, управление транзакциями и прочее. Аннотация @Transactional "работает" только если у вас настроено и используется CMT.

Наличие этой строчки - Session session = utils.getSession() - говорит о том, что скорее всего, ваше приложение само осуществляет процесс создания соединения с БД. В таких случаях контейнер не контролирует действия, выполняемые с полученным соединением с БД (сессией), а аннотация @Transactional игнорируется. Вам следует либо явно подтверждать завершение транзакции вызовом соответствующего метода, либо разбираться с настройкой CMT в вашем проекте.

READ ALSO
Не удается отловить Exception при помощи @Test(expected = PSQLException.class)

Не удается отловить Exception при помощи @Test(expected = PSQLException.class)

У меня тест который должен проверять выброс Exception, но не смотря на то что в StackTrace он попадает, выражение @Test(expected = PSQLExceptionclass) на него не реагирует:

360
Обновление времени со старта JVM

Обновление времени со старта JVM

Код, через который можно узнать время прошедшее со старта JVM таков:

278
Краш android приложения с savedInstanceState

Краш android приложения с savedInstanceState

Лабораторная работа в универеДелаю всё по примеру, но при использовании БД для сохранения данных класса SQLiteOpenHelper программа крашится в эмуляторе...

373
LibGDX actor clickListener

LibGDX actor clickListener

Есть два StageВ одном из них:

341