请问hibernate中merge()、attachDirty()、attachClean()这三个方法是做啥的?怎么用?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请问hibernate中merge()、attachDirty()、attachClean()这三个方法是做啥的?怎么用?相关的知识,希望对你有一定的参考价值。

参考技术A **
* 将传入的detached状态的对象的属性复制到持久化对象中,并返回该持久化对象
* 如果该session中没有关联的持久化对象,加载一个,如果传入对象未保存,保存一个副本并作为持久对象返回,传入对象依然保持detached状态。
* @see com.CodeDepts
*/
public CodeDepts merge(CodeDepts detachedInstance)
log.debug("merging CodeDepts instance");
try
CodeDepts result = (CodeDepts) getSession()
.merge(detachedInstance);
log.debug("merge successful");
return result;
catch (RuntimeException re)
log.error("merge failed", re);
throw re;



/**
* 将传入的对象持久化并保存。
* 如果对象未保存(Transient状态),调用save方法保存。如果对象已保存(Detached状态),调用update方法将对象与Session重新关联。

* @see com.CodeDepts
*/

public void attachDirty(CodeDepts instance)
log.debug("attaching dirty CodeDepts instance");
try
getSession().saveOrUpdate(instance);
log.debug("attach successful");
catch (RuntimeException re)
log.error("attach failed", re);
throw re;



/**
* 将传入的对象状态设置为Transient状态
* @see com.CodeDepts
*/

public void attachClean(CodeDepts instance)
log.debug("attaching clean CodeDepts instance");
try
getSession().lock(instance, LockMode.NONE);
log.debug("attach successful");
catch (RuntimeException re)
log.error("attach failed", re);
throw re;

本回答被提问者采纳

在 Hibernate 中调用 merge() 方法

【中文标题】在 Hibernate 中调用 merge() 方法【英文标题】:Calling the merge() method in Hibernate 【发布时间】:2019-03-28 04:34:54 【问题描述】:

Hibernate 中的merge() 是在数据库中保存数据还是只是将对象附加到持久状态?后续是否需要调用update()方法来持久化状态?

【问题讨论】:

这个问题得到了一些负面评价并且被否决了,但这一切都发生在我编辑它之前。也许现在这个问题比我编辑它之前更好。 如果你想在不知道会话状态的情况下随时保存你的修改,那么在休眠中使用merge()。您需要调用update() 将修改保存在数据库中。 【参考方案1】:

merge() 只是将对象添加到事务单元,之后的任何操作都将成为内存中更改日志的一部分。必须显式调用更新才能保持状态。

【讨论】:

以上是关于请问hibernate中merge()、attachDirty()、attachClean()这三个方法是做啥的?怎么用?的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate中的merge方法

hibernate.merge()方法怎么用

Hibernate的merge()方法

在 merge() 操作中丢失复合外键(JPA/Hibernate)

JPA 和 Hibernate 中的 persist() 和 merge() 有啥区别?

谁懂得hibernate的merge方法?