gpt4 book ai didi

java - 通过 Session.update 和 HibernateTemplate.merge 进行 Hibernate 更新的区别

转载 作者:行者123 更新时间:2023-12-02 12:48:43 26 4
gpt4 key购买 nike

我看到了更新操作的类型:第一:

    getHibernateTemplate().execute(new HibernateCallback() {
public Object doInHibernate(Session session) {
session.flush();
session.setCacheMode(CacheMode.IGNORE);
SomeObject ss = (SomeObject) session.get(SomeObject.class, id);
long next = ss.getAndIncrement();
session.update(ss);
session.flush();
return null;
}
});

其次

    SomeObject ss = loadSomeObject(); 
long next = ss.getAndIncrement();
getHibernateTemplate.merge(ss);

这两个方法的作用是相同的。我想知道哪一种更好、更安全以及为什么。谢谢。

最佳答案

在第一个操作中,对象 ss 附加到 session 。其中第二个操作是分离的。因此,如果您有附加对象,则可以使用更新。如果您有分离的对象,则使用合并,首先将对象附加到 session ,然后将执行更新

编辑:有关附加(持久)和分离对象的信息:

Hibernate 定义并支持以下对象状态:

transient - 如果一个对象刚刚使用 new 运算符实例化,并且它不与 Hibernate Session 关联,则该对象是 transient 的。它在数据库中没有持久表示,也没有分配标识符值。如果应用程序不再持有引用,则瞬时实例将被垃圾收集器销毁。使用 Hibernate Session 使对象持久化(并让 Hibernate 处理此转换需要执行的 SQL 语句)。

持久性 - 持久性实例在数据库中具有表示形式和标识符值。它可能刚刚被保存或加载,但是,根据定义,它位于 session 范围内。 Hibernate 将检测对持久状态对象所做的任何更改,并在工作单元完成时将状态与数据库同步。当对象应该成为 transient 时,开发人员不会执行手动 UPDATE 语句或 DELETE 语句。

分离 - 分离实例是一个已持久化的对象,但其 session 已关闭。当然,对该对象的引用仍然有效,并且分离的实例甚至可能在此状态下被修改。分离的实例可以在稍后的时间点重新附加到新的 session ,使其(以及所有修改)再次持久化。此功能为需要用户思考时间的长时间运行的工作单元提供了编程模型。我们将它们称为应用程序事务,即从用户角度来看的一个工作单元。

关于java - 通过 Session.update 和 HibernateTemplate.merge 进行 Hibernate 更新的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5459176/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com