2

在使用单元测试用例时,我已经阅读了有关 Hibernate 的 setComplete() 方法的 spring 文档。我对 setComplete() 与会话的 flush() 方法感到困惑。两者都负责通过从内存加载到实际数据库来使对象的状态在数据库中持久化。如果有人可以帮助我获得有关相同的良好资源/示例,那就太好了。我将不胜感激。

谢谢, 毛利克

4

1 回答 1

4

据我所知,setComplete()不是Hibernate API 的一部分(当您提到某些东西时请提供链接),它是 API 的一部分,它是 应该在事务中发生的基于 JUnit 3.8 的测试AbstractTransactionalSpringContextTests方便基类,但通常将在每个测试完成时回滚事务setComplete()方法允许更改此默认事务行为。从它的Javadoc:

导致事务为此测试方法提交,即使默认设置为回滚。

文档的以下部分提供了更具体的用例:

8.3.6.3。事务管理

AbstractTransactionalSpringContextTests 取决于在 PlatformTransactionManager应用程序上下文中定义的 bean。由于按类型使用自动装配,因此名称无关紧要。

通常,您将扩展子类 AbstractTransactionalDataSourceSpringContextTests. 此类还要求在应用程序上下文中存在 DataSource bean 定义(同样,具有任何名称)。它创建了一个 JdbcTemplate实例变量,这对于方便查询很有用,并提供了方便的方法来删除选定表的内容(请记住,事务默认会回滚,所以这样做是安全的)。

如果您希望事务以编程方式提交 - 不寻常,但 在您希望特定测试填充数据库时偶尔有用- 您可以调用 setComplete()继承自 AbstractTransactionalSpringContextTests. 这将导致事务提交而不是回滚。作为替代方案,如果您正在针对 Java 5 或更高版本进行开发并扩展 AbstractAnnotationAwareTransactionalTests,您可以通过配置来注释您的测试方法 @Rollback(false)以达到相同的效果。

endTransaction()通过调用该方法,还可以方便地在测试用例结束之前结束事务 。这将默认回滚事务并仅setComplete() 在先前被调用时提交。如果您想测试“断开连接”数据对象的行为,例如将在 Web 或事务外部的远程处理层中使用的 Hibernate 映射实体,此功能很有用。通常,延迟加载错误只能通过 UI 测试才能发现;如果您打电话endTransaction(),您可以通过您的 JUnit 测试套件确保 UI 的正确操作。

Hibernate Session#flush()非常不同,它只是告诉 Hibernate 将挂起的更改写入数据库,它不与事务交互。

于 2010-10-11T21:03:17.430 回答