我们什么时候使用hibernate的会话刷新setComplete()

时间:2010-10-11 18:42:06

标签: hibernate spring flush

在使用单元测试用例时,我已经阅读了有关Hibernate的setComplete()方法的spring文档。我在setComplete()与session的flush()方法之间感到困惑。两者都负责通过从内存加载到实际数据库来使对象的状态在数据库中持久化。如果有人可以帮助我获得关于同样的好资源/例子,那将是很棒的。我将非常感激。

谢谢, Maulik

1 个答案:

答案 0 :(得分:4)

据我所知,setComplete() 是Hibernate API的一部分(请在提及某些内容时提供链接),它是AbstractTransactionalSpringContextTests的API的一部分这是一个方便的基类,适用于基于JUnit 3.8的测试,应该在事务中发生,但通常会在每次测试完成后回滚事务 {{3方法允许更改此默认事务行为。来自它的Javadoc:

  

导致事务为此测试方法提交,即使default设置为rollback也是如此。

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

  

setComplete()

     

AbstractTransactionalSpringContextTests   取决于a   PlatformTransactionManager bean   正在申请中定义   上下文。这个名字无关紧要   按类型使用autowire。

     

通常你会延长   子类,   AbstractTransactionalDataSourceSpringContextTests。   这个班还要求一个   DataSource bean定义 - 再次,   任何名字 - 出现在   应用背景。它创造了一个   JdbcTemplate实例变量,即   对于方便的查询非常有用   提供了方便的删除方法   所选表格的内容(记住   交易将回滚   默认,这样做是安全的。)

     

如果您想要提交事务   以编程方式 - 不寻常,但是   当您希望特定测试填充时,偶尔会有用   数据库 - 你可以打电话给   继承自setComplete()的方法   AbstractTransactionalSpringContextTests。   这将导致交易   提交而不是回滚。作为一个   另外,如果你正在发展   反对Java 5或更高版本   扩展   8.3.6.3. Transaction management,   你可以用你的方法注释你的测试方法   @Rollback(false)实现同样的目标   通过配置效果。

     

还有便利的能力   在测试之前结束交易   案件结束,通过调用   endTransaction()方法。这将   默认情况下回滚事务   并且仅在setComplete()时提交   以前被称为。这个   如果您愿意,功能非常有用   测试'断开'的行为   数据对象,例如Hibernate映射   将在网络中使用的实体或   交易之外的远程层。   通常,延迟加载错误   仅通过UI测试发现;如果   你可以致电endTransaction()   确保UI的正确操作   通过你的JUnit测试套件。

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