我有一个名为变量的对象,其中包含名称和值字段。name 字段是主键,在 Hibernate 中将其作为“标识符”。我想 1)将变量插入数据库(如果它不存在)和 2)更新数据库中的变量(如果它已经存在)。我怎么做?我已经查看了 Hibernate 文档,但我对此感到困惑。它对瞬态、持久和分离状态进行了冗长的解释,我将指出一些问题。
Transient - 如果一个对象刚刚使用 new 运算符实例化,并且它与 Hibernate Session 无关,则它是瞬态的。它在数据库中没有持久表示,也没有分配标识符值。如果应用程序不再持有引用,垃圾收集器将销毁瞬态实例。使用 Hibernate Session 使对象持久化(并让 Hibernate 处理需要为此转换执行的 SQL 语句)。
如果我实例化一个新的变量对象,那么该变量对象显然是瞬态的,因为它是用 new 运算符实例化的。现在,如果我为它分配一个已经在数据库中找到的名称(标识符/主键属性)怎么办?还是暂时的吗?从技术上讲,它还没有与 Hibernate 会话相关联——Hibernate 不知道我的变量对象存在。但是,它确实分配了一个标识符,并且该标识符确实已经存在于数据库中。那么它是什么......在这一点上它是否是一个瞬态对象?
持久性 - 持久性实例在数据库中具有表示形式和标识符值。它可能刚刚被保存或加载,但是,根据定义,它在 Session 的范围内。Hibernate 将检测对处于持久状态的对象所做的任何更改,并在工作单元完成时将状态与数据库同步。开发人员不执行手动 UPDATE 语句,或在对象应为瞬态时执行 DELETE 语句。
这个持久化的定义意味着如果我从 Hibernate Session 加载一个变量对象,.load(Variable.class, "name")
那么这个变量现在是持久化的,因为 Session 知道它的存在。然而,它也表示它将“在工作单元完成时与数据库同步状态”。什么时候发生?在我对它进行更改后,我应该从数据库中调用 .load() 的变量上的 .save() 或 .update() 吗?否则我应该如何让数据库中的值更新?
基本上,我阅读了有关Hibernate - Working with Objects的文档,但对持久状态和瞬态状态的解释仍然不清楚,因此保存、更新和 saveOrUpdate 也是如此。