- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
persist() makes a transient instance persistent. However, it does not guarantee that the identifier value will be assigned to the persistent instance immediately, the assignment might happen at flush time. persist() also guarantees that it will not execute an INSERT statement if it is called outside of transaction boundaries. This is useful in long-running conversations with an extended Session/persistence context.
save() does guarantee to return an identifier. If an INSERT has to be executed to get the identifier ( e.g. "identity" generator, not "sequence"), this INSERT happens immediately, no matter if you are inside or outside of a transaction. This is problematic in a long-running conversation with an extended Session/persistence context.
所以我尝试用一个小例子来说明它是如何工作的。我创建了一个名为 DomesticCat 的实体:
@Entity
public class DomesticCat {
@Id
@GeneratedValue
private long id;
private String name;
}
还有一个小程序来测试这一点,一次使用 save()
,另一次使用 persist()
:
private static void saveData() {
Session session = getSession();
DomesticCat cat = new DomesticCat();
cat.setName("My Cat");
//session.save(cat);
session.persist(cat);
}
对于这个程序,hibernate 生成了相同的保存和持久查询,在本例中是:
select hibernate_sequence.nextval from dual
现在我在代码中添加了一行额外的内容:
session.flush();
现在 hibernate 为两种情况生成插入查询,即保存和持久:
insert into CAT (name, id) values (?, ?)
此外,当我执行 session.flush()
时,当我使用 save() 时,id
会被分配给我的 cat
对象,并且也适用于 persist()
最后,当我使用事务时,数据将存储在数据库表中。
因此,使用这个示例,我可以看到 persist 与 save 之间只有一个区别,即 save 返回标识符,而 persist 不会返回标识符。
那么文档到底说了什么,有人可以帮我举一些例子吗?
更新:
我使用 Oracle 作为数据库。
现在我修改了实体类 ID 生成策略以按如下方式递增:
@Id
@GeneratedValue(generator="increment")
@GenericGenerator(name="increment", strategy = "increment")
private long id;
但即使如此,我也可以看到调用 session.persist()
正在访问数据库以获取 Id 值。这是我的程序及其输出:
private static void saveData() {
Session session = getSession();
DomesticCat cat = new DomesticCat();
cat.setName("My Cat");
System.out.println("before id="+cat.getId());
session.persist(cat);
System.out.println("after id="+cat.getId());
session.flush();
System.out.println("after flush id="+cat.getId());
}
输出:
before id=0
Hibernate: select max(id) from CAT
after id=1
Hibernate: insert into CAT (name, id) values(?, ?)
after flush id=1
根据输出,在我调用 session.flush() 之前,hibernate 正在访问数据库以获取 ID,session.save() 的情况也相同。所以如果我使用Id生成策略来递增,输出没有差异。
最佳答案
所有信息都在文档中。当您进行调用时,save()
将实体刷新到数据库。 persist() 实际上只是标记要在即将到来的刷新中持久化的实体。这是有区别的,通过 persist
,您可以更好地控制实际写入数据库的时间。
关于java - Hibernate persist() 与 save() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25862537/
在 Spring-MVC 应用程序中,我尝试使用 validator 。我将注释 @NotEmpty 和 @Email 放在我的实体之一上,当我尝试验证它时,出现此错误: java.lang.NoSu
网络是我硕士学位的最后一门类(class)。我确实有一个关于如何计算非持久、持久和持久流水线的 http 往返时间的问题。 在花了无数小时阅读有关该问题、从其他大学下载笔记甚至搜索 youtube 视
让我们考虑典型的 订购 和 订单商品 例子。假设 订单商品 是 的一部分订购 聚合,只能通过订单添加。所以,添加一个新的 订单商品 到 订购,我们必须通过 Repository 加载整个 Aggreg
// lookup existing user & set a currently null child entity (ContactInfo) user.setContactInfo(contac
我正在尝试关注 this tutorial .我想我不是从使用可下载项目开始,而是从我之前做过的一个简单的“spring MVC - Maven - eclipse”项目开始。这个项目运行良好。 因此
我正在使用打开 Kubernetes 选项的 docker 应用程序运行 mac OSX Catalina。我使用以下 yaml 和命令创建了一个 PersistentVolume。 apiVersi
假设我有一个类 Employee和一个类Company其中包含 Employee 的 LinkedList对象,我想编写一个添加 Employee 的方法到特定的数据库Company 。我创建了一个新
我实际上正在将我们应用程序的所有组件更新到最新版本。因此,除其他外,我将从 eclipselink-2.5.0 升级到 eclipselink-2.7.3,并从 Tomcat 7 升级到 TomEE。
我试图遵循《用GlassFish 3开始Java EE 6平台》一书第2章中的示例。我正在Windows中使用cmd中的EclipseLink,Derby和Maven。我真的不知道这一点,将不胜感激!
我只是看看ClassGuard (虽然我知道一些 objection )。 但是我得到了 javax.persistence.PersistenceException: [PersistenceUni
我的印象是,如果我们使用持久字段,就不需要 getter 方法,因为实体管理器直接引用实例变量。但是,当我从实体中删除 getter 和 setter 方法以具有持久字段时,未从数据库中检索到相应实例
我正在 Eclipse 中使用 Servlet、JPA、EJB 和 JBoss 进行项目。正如您在我的主题标题中看到的,我的 persistence.xml 文件有错误,但我不知道是哪个:
我已经尝试了一个星期或更长时间来让我的状态在 react native Android 应用程序中持续存在,但在重新水化后状态始终具有初始值。如果我使用 Redux devtools 检查 ASync
什么时候应该坚持,什么时候应该补充水分?命名约定非常困惑,因为作者几乎没有提到它们在 redux-persist 的上下文中的含义。 . 最佳答案 在不真正了解图书馆的情况下: persist = 将
我正在尝试按照老师文档中提供的信息设置一个简单的 jpa 2.0 项目。我已经处理这个问题好几个小时了,但无论我做什么,当我尝试创建 EntityManagerFactory 时,我总是遇到这个异常:
我有一个 Maven 项目,我将其转换为现在可与 Maven 一起使用的 JPA 项目。我的persistence.xml如下: My Persistence Unit
我正在使用 Netbeans 6.8 并构建简单的 Maven Web 应用程序项目。 为持久实体创建实体和主文件 [也创建持久单元] 并使用 EclipsLink。 但是当我运行主文件时出现这个错误
我是 Kubernetes 的新手,我很难理解 Kubernetes 中持久存储背后的整个想法。 这就足够了吗,或者我必须创建持久卷,如果我只部署这两个对象而不创建 PV 会发生什么情况? 存储应该在
我正在尝试使用 JPA 为我目前参与的 Java-EE 项目设置持久性,并且我遇到了许多配置问题。目前,我已经在 persistence.xml 中定义了一个 RESOURCE_LOCAL 持久性单元
Akka 持久性查询通过提供一个通用的基于异步流的查询接口(interface)来补充 Persistence,各种日志插件可以实现该接口(interface)以公开它们的查询功能。 这是来自 akk
我是一名优秀的程序员,十分优秀!