在创建/更新/删除时强制开始事务



我在helloworld程序中有以下代码用于学习hibernate

Configuration cfg=new Configuration();
cfg.configure("hibernate.cfg.xml");
SessionFactory factory = cfg.buildSessionFactory();
Session session = factory.openSession();
Transaction  tx = session.beginTransaction();// line1
College college= new College();
session.saveOrUpdate(college);
tx.commit();//line2
session.close();
factory.close();

上面的代码成功地将学院实体保存在DB中,但如果我删除了第1行和第2行,事实并非如此。创建/更新/删除时是否必须开始事务?

如果是,在另一个应用程序中,我看到

会话.更新(实体)

在没有开始/结束事务的情况下成功工作。我只是在session.update(实体)之后看到session.flush()我不知道为什么它在一个没有交易边界的地方工作,而在另一个地方却不工作?

更新:-

根据RADIM的回答,我在以下尝试

Configuration cfg=new Configuration();
cfg.configure("hibernate.cfg.xml");
SessionFactory factory = cfg.buildSessionFactory();
Session session = factory.openSession();
College college= new College();
session.saveOrUpdate(college);
session.flush();
session.close();
factory.close();

但它并没有在DB

中坚持学院

好处是,没有什么异常或令人惊讶的
只是-如果我们不使用显式事务,那么将使用每个单独写入操作的隐式事务。

没有显式事务begin()commit():
session.flush()将按预期执行每个WRITE操作。每一个变化都会持续存在,或者不会单独存在。它不会被视为一批操作
但结果不会如预期的那样。有些WRITE语句可能会失败,有些则会成功。不是我们想要的。。。

带有显式事务:
如果没有错误,所有WRITE语句都将成功,否则所有语句都将失败
事实上,这应该被标记为唯一的预期行为。。。

当然,尽管并没有什么令人惊讶的——WRITE操作即使在没有显式事务的情况下也能工作——但这并不是建议的方法。

建议:我们应该使用显式事务,以确保session.flush()将以一致的DB状态结束。

最新更新