hibernate envers:合并和合并保存或更新

发布于 2024-10-22 04:41:41 字数 440 浏览 8 评论 0原文

我正在开发 spring-hibernate-envers 应用程序。经过大量谷歌搜索后,事情终于对我有用,但我仍然有几个问题。

  1. 之前我使用saveOrUpdate 保存或更新实体。但 当与恩弗斯一起工作时,它是 抛出一个nonUniqueObject 例外。所以我用 merge 代替 它起作用了。使用是否正确 为此合并?是否合并插入 数据库的新对象?

  2. 我尝试了以下代码:

实体=合并(实体);  
保存或更新(实体);

这也奏效了。这是正确的方法吗?我也很好奇为什么 saveOrUpdate 现在没有抛出任何错误。

I am working on an spring-hibernate-envers application. After lot of googling things are finally working for me but i have still got couple of questions.

  1. Earlier i was using saveOrUpdate for
    saving or updating entities. But
    when working with envers it was
    throwing a nonUniqueObject
    exception. So i used merge instead
    and it worked. Is it right to use
    merge for this? Does merge inserts
    new objects to db?

  2. I tried following code:

entity=merge(entity);  
saveOrUpdate(entity);

This also worked. Is it the right way? And also i am curious that why saveOrUpdate is not throwing any error now.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

夏の忆 2024-10-29 04:41:42

Hibernate 参考 说:

saveOrUpdate() 执行以下操作:

  • 如果该对象已在此会话中持久化,则不执行任何操作
  • 如果与会话关联的另一个对象具有相同的标识符,则抛出异常
  • 如果对象没有标识符属性,则 save() 它
  • 如果对象的标识符具有分配给新实例化的对象的值,则 save() 它
  • 如果对象由 或 进行版本控制,并且版本属性值与分配给新实例化的对象的值相同,则 save() 它
  • 否则 update() 对象

和 merge() 非常不同:

  • 如果当前存在与会话关联的具有相同标识符的持久实例,则将给定对象的状态复制到该持久实例上
  • 如果当前没有与会话关联的持久实例,请尝试从数据库加载它,或创建一个新的持久实例
  • 返回持久化实例
  • 给定实例不会与会话关联,它保持分离状态

这意味着您可以使用< code>saveOrUpdate() 如果您确定具有相同标识符的对象未与会话关联。否则你应该使用merge()

以下代码

entity=merge(entity);
saveOrUpdate(entity); 

之所以有效,是因为 merge() 的结果是一个持久对象,因此它会被 saveOrUpdate() 忽略,因此第二行没有任何意义。

Hibernate Reference says:

saveOrUpdate() does the following:

  • if the object is already persistent in this session, do nothing
  • if another object associated with the session has the same identifier, throw an exception
  • if the object has no identifier property, save() it
  • if the object's identifier has the value assigned to a newly instantiated object, save() it
  • if the object is versioned by a or , and the version property value is the same value assigned to a newly instantiated object, save() it
  • otherwise update() the object

and merge() is very different:

  • if there is a persistent instance with the same identifier currently associated with the session, copy the state of the given object onto the persistent instance
  • if there is no persistent instance currently associated with the session, try to load it from the database, or create a new persistent instance
  • the persistent instance is returned
  • the given instance does not become associated with the session, it remains detached

It means that you can use saveOrUpdate() if you are sure that the object with the same identifier is not associated with the session. Otherwise you should use merge().

The following code

entity=merge(entity);
saveOrUpdate(entity); 

works because the result of merge() is a persistent object, therefore it's ignored by saveOrUpdate(), so that the second line doesn't make any sense.

瘫痪情歌 2024-10-29 04:41:42

saveOrUpdate:如果请求的对象是瞬态的(空主键值),则将其保留在数据库中或更新它。条件是会话中只有该实体的一个副本。

合并: Hibernate会首先检查持久化对象中是否已经存在该类型的持久化实例。
语境。它使用对象标识符来检查是否存在。如果存在另一个实例,它会复制状态
将 Detached 对象合并到现有的 Persistence 对象中。如果不存在其他实例,
Hibernate 只是重新附加 Detached 对象。

如果会话包含单个实体的多个副本,则使用最新实体更新所有副本。 在您调用 update 之前,它不会在数据库中更新。

saveOrUpdate: If requested object is transient(null primary key value) then, persist it in database or update it. The condition is that there is only one copy of that entity in session.

merge: Hibernate will first check whether a Persistent instance of that type already exists in the persistent
context. It uses the object identifiers to check on this existence. If another instance exists, it copies the state
of the Detached object into the existing Persistence object. If no other instance exists,
Hibernate just reattaches the Detached object.

If the session contains more then one copy of a single entity, then update all the copy with latest entity. It will not update in database until you call update.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文