休眠中的不同保存方法之间有什么区别?
2022-08-31 06:06:03
Hibernate有一些方法,这些方法以某种方式获取您的对象并将其放入数据库中。它们之间有什么区别,何时使用哪个,为什么没有一种智能方法知道何时使用什么?
到目前为止,我确定的方法是:
save()
update()
saveOrUpdate()
saveOrUpdateCopy()
merge()
persist()
Hibernate有一些方法,这些方法以某种方式获取您的对象并将其放入数据库中。它们之间有什么区别,何时使用哪个,为什么没有一种智能方法知道何时使用什么?
到目前为止,我确定的方法是:
save()
update()
saveOrUpdate()
saveOrUpdateCopy()
merge()
persist()
以下是我对方法的理解。主要是这些是基于API的,因为我在实践中不使用所有这些。
保存或更新呼叫可以保存或更新,具体取决于某些检查。例如,如果不存在标识符,则调用 save。否则,将调用更新。
救持久保存实体。如果标识符不存在,将分配一个标识符。如果这样做,它本质上是在进行更新。返回实体的生成 ID。
更新尝试使用现有标识符保留实体。如果不存在标识符,我相信会引发异常。
保存或更新复制这已被弃用,不应再使用。相反,有...
合并现在,这就是我的知识开始动摇的地方。这里重要的是瞬态、分离和持久性实体之间的区别。有关对象状态的详细信息,请查看此处。使用保存和更新,您正在处理持久性对象。它们链接到会话,因此Hibernate知道发生了什么变化。但是,当您具有瞬态对象时,不涉及会话。在这些情况下,您需要使用合并进行更新,并使用保留以进行保存。
坚持如上所述,这用于瞬态对象。它不返回生成的 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() ║
║ ║ ║ ║
╚══════════════╩═══════════════════════════════╩════════════════════════════════╝