0

众所周知,在 Hibernate 中,如果没有事务提交,则更改不会影响数据库。但是我发现了一些奇怪的东西。代码如下:

ApplicationContext ctx = new ClassPathXmlApplicationContext("Spring.xml");
    SessionFactory sessionFactory = (SessionFactory) ctx.getBean("sessionFactory");
    Session session = sessionFactory.openSession();
    Model model = new Model();
    ...
    session.save(model);
    session.flush();
    session.close();

即使没有交易,模型也被保存到数据库中,任何人都可以解释一下吗?任何意见将不胜感激!谢谢!

PS:我正在使用mysql。

4

3 回答 3

1

session.flush 命令保存了事务。如果是错误的,你应该使用事务。

于 2013-01-23T09:02:29.700 回答
1

通常hibernate需要线路session.beginTransaction();才能工作。你没有写,你的应用程序工作,我猜你的应用程序运行在提供事务管理的应用程序服务器中。例如 jboss、weblogic...

但是,这并不意味着没有交易。您是否将自动提交设置为 true?

顺便说一句, session.flush() 和 txn.commit() 是不同的。

刷新是将底层持久存储与内存中保存的持久状态同步的过程。

在 session.flush() 之后,您仍然可以调用 txn.rollback() 来回滚所有更改。

编辑

哦,我看到你用过弹簧。你在春天配置了 txnmanager 吗?

于 2013-01-23T09:49:30.363 回答
0

Hibernate 不需要事务,基于数据库的应用程序中最常见的问题只是通过事务更容易解决,这就是为什么通常每个人都使用 Hibernate 的事务。但这仅仅是巧合/约定/懒惰。

Hibernate 的所有需求都是一个java.sql.Connection,如果你的容器提供了一个,即使当前没有配置事务管理器,Hibernate 也可以。

事实上,Hibernate 并不知道可能存在事务管理器。所以session.flush()将使用ApplicationContext获取连接,生成 SQL 并使用 JDBC 将生成的 SQL 代码发送到数据库。

从 Hibernate 的角度来看,这就是发生的一切。

将数据提交到数据库的原因可能有多种:

  1. 您忘记在连接上打开自动提交。
  2. 你的 web 容器/spring 配置会自动连接一个与 HTTP 请求同步的事务管理器。
  3. 您的代码被称为另一种方法,该方法用@Transactional;注释 在这种情况下,您继承现有事务。
于 2013-01-23T10:52:19.800 回答