Java 为什么即使存在';这不涉及交易吗?

Java 为什么即使存在';这不涉及交易吗?,java,hibernate,Java,Hibernate,我们都知道,在Hibernate中,如果没有事务提交,更改将不会影响数据库。但我发现了一些奇怪的东西。守则如下: ApplicationContext ctx = new ClassPathXmlApplicationContext("Spring.xml"); SessionFactory sessionFactory = (SessionFactory) ctx.getBean("sessionFactory"); Session session = sessionFacto

我们都知道,在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。

session.flush命令保存了事务。如果错误,则应使用事务。

通常hibernate需要行
session.beginTransaction()开始工作。您没有编写这些,并且您的应用程序工作正常,我猜您的应用程序运行在提供事务管理的应用程序服务器中。e、 jboss,weblogic

然而,这并不意味着没有交易。您是否将自动提交设置为真

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

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

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

编辑


哦,我看见你用弹簧了。您是否在spring中配置了txnmanager?

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

Hibernate只需要一个
java.sql.Connection
,如果您的容器提供了一个连接,即使当前没有配置事务管理器,Hibernate也可以

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

从Hibernate的角度来看,这就是所有发生的事情

将数据提交到数据库可能有以下几个原因:

  • 您忘记打开连接上的自动提交
  • 您的web容器/spring配置自动连接与HTTP请求同步的事务管理器
  • 您的代码从另一个方法调用,该方法用
    @Transactional
    注释;在这种情况下,您将继承现有事务

  • 但是,如果没有声明任何事务,session.flush()如何提交该事务呢?谢谢您的评论!是的,我在spring中配置了txmanager,但这段代码没有@Transactional注释。最后我发现问题是,如果没有声明事务,hibernate会将auto commit设置为true。。。