休眠中的不同保存方法之间有什么区别?

2022-08-31 06:06:03

Hibernate有一些方法,这些方法以某种方式获取您的对象并将其放入数据库中。它们之间有什么区别,何时使用哪个,为什么没有一种智能方法知道何时使用什么?

到目前为止,我确定的方法是:

  • save()
  • update()
  • saveOrUpdate()
  • saveOrUpdateCopy()
  • merge()
  • persist()

答案 1

以下是我对方法的理解。主要是这些是基于API的,因为我在实践中不使用所有这些。

保存或更新呼叫可以保存或更新,具体取决于某些检查。例如,如果不存在标识符,则调用 save。否则,将调用更新。

持久保存实体。如果标识符不存在,将分配一个标识符。如果这样做,它本质上是在进行更新。返回实体的生成 ID。

更新尝试使用现有标识符保留实体。如果不存在标识符,我相信会引发异常。

保存或更新复制这已被弃用,不应再使用。相反,有...

合并现在,这就是我的知识开始动摇的地方。这里重要的是瞬态、分离和持久性实体之间的区别。有关对象状态的详细信息,请查看此处。使用保存和更新,您正在处理持久性对象。它们链接到会话,因此Hibernate知道发生了什么变化。但是,当您具有瞬态对象时,不涉及会话。在这些情况下,您需要使用合并进行更新,并使用保留以进行保存。

坚持如上所述,这用于瞬态对象。它不返回生成的 ID。


答案 2
╔══════════════╦═══════════════════════════════╦════════════════════════════════╗
║    METHOD    ║            TRANSIENT          ║            DETACHED            ║
╠══════════════╬═══════════════════════════════╬════════════════════════════════╣
║              ║       sets id if doesn't      ║   sets new id even if object   ║
║    save()    ║     exist, persists to db,    ║    already has it, persists    ║
║              ║    returns attached object    ║ to DB, returns attached object ║
╠══════════════╬═══════════════════════════════╬════════════════════════════════╣
║              ║       sets id on object       ║             throws             ║
║   persist()  ║     persists object to DB     ║       PersistenceException     ║
║              ║                               ║                                ║
╠══════════════╬═══════════════════════════════╬════════════════════════════════╣
║              ║                               ║                                ║
║   update()   ║           Exception           ║     persists and reattaches    ║
║              ║                               ║                                ║
╠══════════════╬═══════════════════════════════╬════════════════════════════════╣
║              ║  copy the state of object in  ║    copy the state of obj in    ║
║    merge()   ║     DB, doesn't attach it,    ║      DB, doesn't attach it,    ║
║              ║    returns attached object    ║     returns attached object    ║
╠══════════════╬═══════════════════════════════╬════════════════════════════════╣
║              ║                               ║                                ║
║saveOrUpdate()║           as save()           ║            as update()         ║
║              ║                               ║                                ║
╚══════════════╩═══════════════════════════════╩════════════════════════════════╝

推荐