Hibernate有几种方法,它们以一种或另一种方式将你的对象放入数据库。它们之间有什么区别,何时使用它们?为什么不只有一种智能的方法知道何时使用什么?
到目前为止,我已经确定的方法是:
这是我对方法的理解。这些主要基于API,尽管我在实践中并未全部使用。
saveOrUpdate 根据某些检查调用保存或更新。例如,如果不存在标识符,则调用save。否则,将调用更新。
保存 保持实体。如果不存在,将分配一个标识符。如果有的话,它实际上是在进行更新。返回生成的实体ID。
更新 尝试使用现有标识符持久化实体。如果不存在标识符,则认为会引发异常。
saveOrUpdateCopy 这是不推荐使用的,不应再使用。相反,有…
合并 现在,我的知识开始动摇。这里重要的是临时实体,分离实体和持久实体之间的区别。有关对象状态的更多信息,请在此处查看。使用保存和更新,您可以处理持久对象。它们链接到会话,因此Hibernate知道发生了什么变化。但是,当您有一个临时对象时,就不会涉及会话。在这些情况下,您需要使用merge进行更新,并坚持保存。
持久 如上所述,它用于瞬态对象。它不返回生成的ID。
╔══════════════╦═══════════════════════════════╦════════════════════════════════╗ ║ 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() ║ ║ ║ ║ ║ ╚══════════════╩═══════════════════════════════╩════════════════════════════════╝