【发布时间】:2011-10-04 08:53:54
【问题描述】:
我在理解 @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);
}
}
也许问题是因为 Repository 和 TestClass 标有@Transactional?
在此先感谢您。
【问题讨论】: