java - Hibernate 事务回滚是否会删除 "session.flush()"ed 实体?

标签 java hibernate orm

我一直对 transaction.rollback 感到困惑。这是示例伪代码:

transaction = session.beginTransaction()    
EntityA a = new EntityA();    
session.save(a);    
session.flush();    
transaction.rollback();

当这段代码有效时会发生什么?我是否在数据库中有实体?

最佳答案

简短回答:不,您不会在数据库中拥有实体。

更长的答案:在您的情况下,hibernate 足够聪明,不会向数据库发送插入/更新,直到它知道事务是否将被提交或回滚(尽管可以通过设置不同的 FlushMode 来更改此行为)通过调用flush,您将强制将SQL发送到数据库,但您仍然有数据库事务来保护您,当您调用回滚时,数据库事务将被回滚,删除其内部执行的更改,因此实际上不会保存任何内容。请注意,根据您配置的事务隔离级别,其他事务可能会以某种方式看到您在保存和回滚之间短暂保存的 EntityA。 另请注意,当您尝试从 DB 读取时,会自动调用 flush,在 99% 的情况下,不需要显式调用它。想到的一个异常(exception)是使用自动回滚测试进行单元测试时。

关于java - Hibernate 事务回滚是否会删除 "session.flush()"ed 实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9908082/

相关文章:

java - Hibernate 中不必要的查询 - MySql

java - 无法运行 hibernate (无法加载请求的类)

java - 哪种 Hibernate FetchMode 会导致集合延迟加载?

java - 还原已在本地创建的最小化 JFrame

java - JVM 崩溃 hs_err_pidXXXX.log 文件已创建。但是没有生成 hprof 文件

java - Apache http 客户端 : Received fatal alert: bad_certificate

java - Wicket 口、身份验证和交易界定

c# - EF4 在保存更改之前看不到上下文更改

python - 在标识映射之外强制使用 sqlalchemy ORM get()

java - Camel 异常/错误处理事务路由,不会导致客户端异常