Java 创建/更新/删除时必须开始事务吗?
我在hello world学习hibernate的程序中有以下代码Java 创建/更新/删除时必须开始事务吗?,java,hibernate,Java,Hibernate,我在hello world学习hibernate的程序中有以下代码 Configuration cfg=new Configuration(); cfg.configure("hibernate.cfg.xml"); SessionFactory factory = cfg.buildSessionFactory(); Session session = factory.openSession(); Transaction tx = session.beginTransaction();/
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中好的是,没有什么特别或令人惊讶的事情。
Just-如果不使用显式事务,则将使用每个分离的写入操作的隐式事务 无显式事务开始()提交():
session.flush()
将按预期执行每个写入操作。每项更改都将被保留或不保留。不会将其视为一批操作。但结果却出乎意料。有些WRITE语句可能会失败,有些则会成功。不是我们想要的 与显式交易:
如果没有错误,所有写语句都将成功,否则所有写语句都将失败。
事实上,这应该被标记为唯一的预期行为 当然,尽管写操作即使在没有显式事务的情况下也能工作,这并不令人惊讶,但我们并不建议使用这种方法 建议:我们应该使用显式事务,以确保
会话.flush()
将以一致的DB状态结束