Java @事务注释的方法不会将数据保存到数据库中
在我的单元测试中,我想持久化一些实体,并测试它们从数据库中的检索。它们没有被保存,我发现当测试方法也被注释为Java @事务注释的方法不会将数据保存到数据库中,java,spring,hibernate,Java,Spring,Hibernate,在我的单元测试中,我想持久化一些实体,并测试它们从数据库中的检索。它们没有被保存,我发现当测试方法也被注释为@Transaction时,它内部发生的任何事情都不会被持久化,即使方法完成时没有错误 我以前遇到过一个lazyiinitializationexception,当时我正在处理一个多对多延迟加载的关联,并且用@Transaction注释该方法似乎可以解决这个问题,这就是为什么我一直在使用它 实体无法保存的原因可能是什么?没有理由回滚事务,因为它不会失败 相关类代码: @Test @Tran
@Transaction
时,它内部发生的任何事情都不会被持久化,即使方法完成时没有错误
我以前遇到过一个lazyiinitializationexception
,当时我正在处理一个多对多延迟加载的关联,并且用@Transaction
注释该方法似乎可以解决这个问题,这就是为什么我一直在使用它
实体无法保存的原因可能是什么?没有理由回滚事务,因为它不会失败
相关类代码:
@Test
@Transactional
public void plainPersistence() throws NullParameterException {
User user = userHelper.createUser("User1", "password", null, null);
Assert.assertNotNull(userDAO.findByUsername("User1"));
}
用户助手:
@Service
public class UserHelper {
@Autowired
private UserDAO userDAO;
public User createUser(...) throws NullParameterException {
User newUser = new User(username, ...);
userDAO.save(newUser);
return newUser;
}
UserDAO的save()
方法随后在UserRepository
上调用save()
:
@Repository
public interface UserRepository extends CrudRepository<User, Long> {
public User findByUsername(String username);
}
@存储库
公共接口UserRepository扩展了Crudepository{
公共用户findByUsername(字符串用户名);
}
由于您可能正在使用,您应该注意,它们的配置使默认行为是回滚更改。要改变这一点,如果您使用的是Spring<4.2,那么您应该用注释您的测试类
@TransactionConfiguration(defaultRollback = false)
否则,请用谢谢注释课堂,这确实有帮助。虽然现在我得到一个异常
org.springframework.transaction.TransactionSystemException:无法提交JPA事务;嵌套异常是javax.persistence.RollbackException:标记为rollbackOnly的事务
,但我认为这是一个进步,这是由于逻辑本身发生了真正的异常。这你得弄清楚