我在学习Hibernate框架的同时从一本书中看到了这个例子。
public class BasicMovieManager()
{
private void persistMovie(Movie movie)
{
Session session=sessionFactory.getCurrentSession();
session.beginTransaction();
session.save(movie);
session.getTransaction().commit();
}
}
我可以理解Movie对象必须被映射并写入数据库。我也明白提交步骤会写入数据库。但save()
在这里的目的是什么?我提到的一些消息来源称save()
持续数据。不坚持是否意味着写入永久存储?如果没有,它究竟是什么意思?
答案 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.
Commit
会将数据保存到数据库,因此您不能再回滚,而不是Flush
。
Save
将在编写对象之前生成并返回标识符,稍后在Flush
或Commit
将数据写入数据库。
其中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()会刷新会话,但它也会结束与事务关联的工作单元。
有关这些方法的更多详情,请在链接下方
答案 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()
用于事务管理