Проблема отката транзакции пружинного теста - PullRequest
2 голосов
/ 13 июля 2011

У меня проблема с пониманием аннотаций @Transactional и @TransactionConfiguration (defaultRollback = true).

У меня есть тестовый код, который вставляет учетную запись пользователя в базу данных, затем следует вставить другую учетную запись с тем же именем, что должно привести к исключению DataIntegrityViolationException, поскольку имя учетной записи помечается как уникальное. Это прекрасно работает, если @Transactional и @TransactionConfiguration (defaultRollback = true) не разделены на уровне TestClass. Но если откат включен, я не получаю исключение, потому что даже в том же методе данные не вставляются в базу данных. Если я установил точку останова после вставки первой учетной записи, база данных все еще будет пустой.

Вот мой код:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:/spring/applicationContext.xml"})
@Transactional
@TransactionConfiguration(defaultRollback = true)
public class DaoTests {

    @Autowired
    private Repository repo;
    @Autowired
    private AccountService userService;

    @Before
    public void orgInstAccount() {
        Organization o = new Organization();
        o.setName("Organisation 1");
        repo.saveEntity(o);

        Institution i1 = new Institution();
        i1.setName("xyz");
        i1.setOwningOrganization(o);
        repo.saveEntity(i1);

    }

    @Test(expected = DataIntegrityViolationException.class)
    public void saveUserFail() {

        Account user = new Account();
        user.setAccountname("chz");
        user.setPassword(userService.calcMD5Hash("123"));
        user.setOwningInstitution(repo.getInstitutionByName("xyz"));
        repo.saveEntity(user);
        Assert.assertNotNull(repo.getAccountByName("chz"));


        Account userNew = new Account();
        userNew.setAccountname("chz");
        userNew.setPassword(userService.calcMD5Hash("123"));
        userNew.setOwningInstitution(repo.getInstitutionByName("xyz"));
        repo.saveEntity(userNew);
        //Here the Exception should be thrown but everything works fine.

    }

}

Реализация репозитория:

@Repository
@Transactional
@SuppressWarnings("unchecked")
public class RepositoryHibernateImpl implements Repository {

    @Autowired
    private SessionFactory factory;

    @Override
    public void saveEntity(Entity hce) {
        factory.getCurrentSession().save(hce);
    }
}

Может быть, проблема в том, что репозиторий и TestClass помечены @Transactional?

Заранее спасибо.

1 Ответ

4 голосов
/ 13 июля 2011

Call flush(), который попытается немедленно вызвать sql вместо того, чтобы отложить его до границы транзакции

factory.getCurrentSession().flush()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...