【问题标题】:What exactly does org.hibernate.Session.save() do?org.hibernate.Session.save() 究竟是做什么的?
【发布时间】:2013-02-20 00:03:50
【问题描述】:

我知道Session.save() 会保留瞬态对象。我看到它也有saveOrUpdate(),还有persist()

我想那save() 相当于SQL INCLUDE,是吗?

如果我有一个已经存在于 DB 上的对象并且我 save() 它,是否会包含另一行,是否会更新其字段,或者它会被忽略而不发生任何事情?

【问题讨论】:

  • 嗨,您是否查看过 Hibernate 文档:hibernate.org/docs 您没有提及您使用的是哪个版本。以后请使用代码块。谢谢

标签: java hibernate


【解决方案1】:

savesaveOrUpdate的区别

savesaveOrUpdate 方法之间的主要区别在于save 生成一个新标识符并将INSERT 记录到数据库中,而saveOrUpdate 可以INSERT 或根据记录的存在进行更新。所以save 将继续进行而不执行存在检查,另一方面saveOrUpdate 将检查是否存在,如果记录存在,它将被更新,否则将插入新记录。

persistsave 的基本区别

1)savepersist 之间的第一个区别是它们的return 类型。与save 方法类似,persist 也将INSERT 记录到数据库中,但persist 的返回类型为void,而save 的返回类型为Serializable object

2) persistsave 之间的另一个区别是这两种方法都使瞬态实例持久化。但是,persist 方法并不能保证标识符值会立即分配给持久化实例,分配可能会在刷新时发生。

【讨论】:

  • save() 方法可以在手动分配 id 的情况下进行 SQL 更新(并且它存在于数据库中)
【解决方案2】:

据我所知是这样的:

  1. save() 只是在保存您的实体
  2. persist() 正在将您的实例修改为托管实体。这意味着如果您对其进行操作并且您的交易仍然处于打开状态,那么当您调用 flush() 时它将自动保存(如果我没记错的话)
  3. merge() 还有一个类似于 persist() 但它返回一个新实例而不是修改你的旧实例....
  4. saveOrUpdate()你可以see here

【讨论】:

    【解决方案3】:
         save Persists an entity. Will assign an identifier if one doesn't exist.
         If one does, it's essentially doing an update. 
         Returns the generated ID of the entity.
    

    我的建议是,您确实需要阅读 this 以进一步了解。

    【讨论】:

    • 谢谢。 save() - If an INSERT has to be executed to get the identifier, then 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.你能告诉我插入如何在会话之外发生吗?为什么它不好?
    【解决方案4】:

    save() 方法将记录插入数据库。但是 saveorupdate() 方法检查 pk 如果找到 pk 然后更新数据,否则将数据插入数据库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-13
      • 2016-12-07
      相关资源
      最近更新 更多