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=PERSIST
或cascade=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提供者提出要求 这使我感到