Spring测试事务回滚问题

Spring测试事务回滚问题,spring,rollback,Spring,Rollback,我在理解@Transactional和@TransactionConfiguration(defaultRollback=true)注释时遇到问题 我有一个测试代码,它将一个userAccount插入数据库,然后插入另一个同名的帐户,这将导致DataIntegrityViolationException,因为AccountName被标记为唯一。如果@Transactional和@TransactionConfiguration(defaultRollback=true)未在TestClass级别

我在理解@Transactional和@TransactionConfiguration(defaultRollback=true)注释时遇到问题

我有一个测试代码,它将一个userAccount插入数据库,然后插入另一个同名的帐户,这将导致DataIntegrityViolationException,因为AccountName被标记为唯一。如果@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

提前感谢。

调用
flush()
,它将尝试立即调用sql,而不是将其延迟到事务边界

factory.getCurrentSession().flush()

谢谢你的帮助。这就解决了问题。但是如果我调试的话,实际上没有任何东西写入数据库,所以所有的事情都是在内存数据库中执行的?如果你真的想知道这些是如何工作的,我建议你浏览一下源代码,特别是sessionfactorympl和SessionImpl以及