使用hibernate时,数据库中save()和commit()之间的区别

时间:2015-12-16 11:39:00

标签: java hibernate

我在学习Hibernate框架的同时从一本书中看到了这个例子。

public class BasicMovieManager()
{
    private void persistMovie(Movie movie)
    {
        Session session=sessionFactory.getCurrentSession();
        session.beginTransaction();
        session.save(movie);
        session.getTransaction().commit();
    }
}

我可以理解Movie对象必须被映射并写入数据库。我也明白提交步骤会写入数据库。但save()在这里的目的是什么?我提到的一些消息来源称save() 持续数据。不坚持是否意味着写入永久存储?如果没有,它究竟是什么意思?

4 个答案:

答案 0 :(得分:3)

我相信比较错位,你应该比较

Commit vs Flush

Save vs Persist

<强>编辑:

你应该知道this

transient: never persistent, not associated with any Session.    
persistent: associated with a unique Session.
detached: previously persistent, not associated with any Session.
  1. Commit会将数据保存到数据库,因此您不能再回滚,而不是Flush

  2. Save将在编写对象之前生成并返回标识符,稍后在FlushCommit将数据写入数据库。

    其中Persist不会返回值,因为您只在缓存中将对象标记为脏,因此在刷新或提交时它将被保存,这在事务中持久化多个对象时很有用。

答案 1 :(得分:0)

快速回答:save()将数据存储在数据库中。 commit()让其他人可以看到(参见isolation levels)。

稍微长一点的回答:数据库操作应遵守ACID principle,(A)tomicity是这里的操作元素。如果您正在进行多个更改/插入,则可以将其包装在事务中并提交/拒绝整个操作集。

在你的例子中,开始交易没有多大意义,但在现实生活中它非常有意义。

干杯,

答案 2 :(得分:0)

save方法,保留给定的瞬态实例,首先分配生成的标识符。 (或者,如果使用指定的生成器,则使用identifier属性的当前值。) 如果关联映射为cascade =&#34; save-update&#34;。与会话相关联,则此操作会级联到关联实例

commit方法,刷新关联的Session并结束工作单元(除非我们在FlushMode.NEVER中。 当且仅当底层事务是由此对象启动时,此方法才会提交基础事务.Commit将使数据库提交。对持久对象的更改将写入database.transaction.commit()会刷新会话,但它也会结束与事务关联的工作单元。

有关这些方法的更多详情,请在链接下方

https://docs.jboss.org/hibernate/orm/3.2/api/

答案 3 :(得分:0)

当您尝试保留相关的对象集时,基本上会使用事务。如果您只想插入一个对象,则无需进行事务处理。但是当你试图坚持一组依赖于彼此的相关对象时,你应该去交易方便它

例如:

//1.Load session
//2. persist an object

在上面的场景中,如果单个对象的持久性失败或成功,但是当你这样做时,不会发生任何事情:

//1. Load session
//2. Persist one object
//3. Persist other object whose data affects previous

在上述情况中,假设第二次成功执行,但第三次失败,可能会对您的数据或业务产生负面影响。这可以解决为:

//1. Load session
//2. Begin transaction
//3. perform set of related operation
//4. commit

如果在上述场景中出现任何问题,整个交易将被回滚,不会持续存在。如果您想在事务失败后做某事,可以使用try catch来处理它。

因此,基本上save()用于保存表中的数据,但commit()用于事务管理