当前位置: 首页 > 面试题库 >

在JPA和Hibernate中,persist()和merge()之间有什么区别?

邢浩邈
2023-03-14
问题内容

Hibernate中的persist()和merge()有什么区别?

persist() 可以创建UPDATE&INSERT查询,例如:

SessionFactory sef = cfg.buildSessionFactory();
Session session = sef.openSession();
A a=new A();
session.persist(a);
a.setName("Mario");
session.flush();

在这种情况下,将生成 查询, 如下所示:

Hibernate: insert into A (NAME, ID) values (?, ?)
Hibernate: update A set NAME=? where ID=?

因此persist()方法可以 生成 一个插入和一个更新。

现在merge()

SessionFactory sef = cfg.buildSessionFactory();
Session session = sef.openSession();
Singer singer = new Singer();
singer.setName("Luciano Pavarotti");
session.merge(singer);
session.flush();

这是我在数据库中看到的:

SINGER_ID   SINGER_NAME
1           Ricky Martin
2           Madonna
3           Elvis Presley
4           Luciano Pavarotti

现在使用更新记录 merge()

SessionFactory sef = cfg.buildSessionFactory();
Session session = sef.openSession();
Singer singer = new Singer();
singer.setId(2);
singer.setName("Luciano Pavarotti");
session.merge(singer);
session.flush();

这是我在数据库中看到的:

SINGER_ID   SINGER_NAME
1           Ricky Martin
2           Luciano Pavarotti
3           Elvis Presley

问题答案:

JPA规范包含对这些操作的语义的非常精确的描述,比在javadoc中更好:

应用于实体X 的 persist 操作的语义如下:

  • 如果X是新实体,则它将成为托管实体。实体X将在事务提交时或之前或作为刷新操作的结果输入数据库中。

* 如果X是一个预先存在的管理实体,则persist操作将忽略它。但是,如果从X到这些其他实体的关系用cascade=PERSISTcascade=ALL
注释元素值进行注释或用等效的XML描述符元素指定,则持久化操作将级联到X引用的实体 。

  • 如果X是已删除的实体,则它将被管理。

  • 如果X是一个分离的对象,则
    EntityExistsException当persist操作被调用时,或者可能抛出EntityExistsException或另一个PersistenceException可在冲洗被抛出或提交时间。

  • 对于由X的关系引用的所有实体Y,如果与Y的关系已用级联元素值cascade=PERSIST或注释
    cascade=ALL,则将持久操作应用于Y。

应用于实体X 的 合并 操作的语义如下:

  • 如果X是一个分离的实体,则将X的状态复制到具有相同标识的预先存在的管理实体实例X’上,或者创建X的新的管理副本X’。

  • 如果X是新的实体实例,则创建新的管理实体实例X’,并将X的状态复制到新的管理实体实例X’中。

  • 如果X是已删除的实体实例,IllegalArgumentException则合并操作将抛出an (否则事务提交将失败)。

  • 如果X是受管实体,则合并操作将忽略它,但是,如果已用级联元素值cascade=MERGE
    cascade=ALL注释对这些关系进行了注释,则合并操作将级联到X中的关系所引用的实体。

  • 对于由来自具有级联元素值cascade=MERGE或的X的关系引用的所有实体Y
    cascade=ALL,将Y递归合并为Y’。对于X引用的所有此类Y,将X’设置为引用Y’。(请注意,如果管理X,则X与X’是同一对象。)

* 如果X是合并到X’的实体,并引用了另一个实体Y(其中未指定cascade=MERGE或未cascade=ALL指定),则从X’导航相同的关联会生成对具有与Y相同的持久标识的托管对象Y’的引用。



 类似资料:
  • 问题内容: 通过文档,我只能找到一个不同之处,即save方法生成将对象作为生成的标识符返回,但persist不是。这是提供persist方法的唯一目的。如果是的话,即使他不打算这样做对程序员也有帮助要使用生成的标识符,他可以使用save并忽略返回值。 也来通过这个线程有什么优势依然存在(中)与保存()在Hibernate中?。我可以从此线程获取的有意义的语句是 persist(),还可以保证,如果

  • 本文向大家介绍Hibernate中save()和persist()之间的区别,包括了Hibernate中save()和persist()之间的区别的使用技巧和注意事项,需要的朋友参考一下 Save()和这两种方法都用于在数据库中保存对象。  根据文档- Save()-坚持给定的瞬时实例,首先分配一个生成的标识符。(或者,如果使用分配的生成器,则使用标识符属性的当前值。)如果关联是用cascade

  • 请帮助我理解在哪里使用常规连接以及连接在哪里提取。 例如,如果我们有这两个查询 而且 它们之间有什么区别吗?如果是,何时使用哪一种?

  • 问题内容: 单向关联和双向关联有什么区别? 由于在数据库中生成的表都是相同的,所以我发现的唯一区别是双向关联的每一侧都有一个引用,而单向则没有。 这是单向关联 双向关联 区别在于该组是否持有用户的参考。 所以我想知道这是否是唯一的区别?哪个推荐? 问题答案: 主要区别在于,双向关系提供了双向导航访问,因此您无需显式查询即可访问另一侧。此外,它还允许您在两个方向上应用级联选项。 请注意,导航访问并不

  • 问题内容: 但没人回答我的下一个问题。经典的hibernate方法使用和JPA 实现之间有什么区别?我听说此JPA实现使用并像包装器一样工作,这是真的吗? 问题答案: 确实。 JPA只是一个API,允许您从使用的持久层中进行抽象。Hibernate提供了充当接口的实现,它使用与Hibernate 相同的基础方法。 这个想法是,例如,您可以将实现切换到Eclipse Link,而不必更改任何源代码。

  • 问题内容: 我知道JPA 2是一个规范,而Hibernate是ORM的工具。另外,我了解到Hibernate具有比JPA 2更多的功能。但是从实际的角度来看,真正的区别是什么? 我有使用iBatis的经验,现在我想学习Hibernate或JPA2。我拿起Pro JPA2书籍,并且一直指“ JPA提供者”。例如: 如果您认为某个功能应该被标准化,则应该大声疾呼并向您的JPA提供者提出要求 这使我感到