JPA EntityManager:仅在明确请求时保存对象

问题描述 投票:0回答:1

我对Hibernate和JPA还是陌生的,目前正在开发通过JPA的EntityManager使用它的应用程序。

[使用Hibernate会话查看一些基本的Hibernate教程时,我发现可以做到:

val session = HibernateUtil.getSessionFactory().getCurrentSession()
session.beginTransaction()
val coordinates = session.find(Coordinates::class.java, "12345")
coordinates.longitude = 0.0
session.save(coordinates)
session.getTransaction().commit()

[使用Entitymanager时,方法是这样的:

val em = emFactory.createEntityManager()
em.transaction.begin()
val coordinates = em.find(Coordinates::class.java, "12345")
coordinates.longitude = 0.0
em.transaction.commit()

这里的主要区别在于,使用EntityManager时,我不必显式调用save函数即可实际更新对象,该对象最终将在提交过程中刷新。当然,我可以做类似

的操作
if(obj.id == null) {
    return em.merge()
} else {
    val saved = em.persist(obj)
    return saved
}

但是如果已经存在的对象无论如何被保存,无论我是否调用它,那有什么意义呢?

令人惊讶的是,在此处发现的examples似乎也依赖于保存方法。

我的问题是:有没有一种方法可以配置EntityManager仅在明确要求时(即mimick会话行为)才更新对象?还是我必须使用Session来实现这一目标?

java hibernate jpa kotlin entitymanager
1个回答
0
投票

merge是EntityManager实际执行数据库操作的机会。合并,持久化,刷新和提交基本上都是与数据库的联系点。

对于简单的情况,您可以仅依靠在提交时更改行为,而不必物理地合并自己,但是许多人喜欢控件知道何时实际发生。知道“此后,它在数据库中”。因为在合并之后,不仅数据得以保留,并伴随任何级联行为,而且触发器等对数据库的副作用也都发生了。

他们没有承诺,但是已经发生了。为父母和孩子分配了密钥,触发了触发器,触发了生命周期方法,所有内容都是“应有的状态”,“现在”和“将来的某个时间”,即使可能只有几毫秒之遥。

© www.soinside.com 2019 - 2024. All rights reserved.