Hibernate 6 弃用 saveOrUpdate():使用 merge() 和 persist() 代替
2024-03-15 04:15:45
告别 saveOrUpdate():用 Hibernate 6 中的 merge() 和 persist() 替换弃用方法
在 Hibernate 6 中,saveOrUpdate()
方法已被弃用,取而代之的是 merge()
和 persist()
方法。虽然这可能会导致一些测试中断,但了解这两种方法之间的差异可以确保你的代码在 Hibernate 6 中平稳运行。
理解 saveOrUpdate()
saveOrUpdate()
方法是一个便利方法,它检查实体是否已经存在于数据库中。如果存在,它将更新实体;如果不存在,它将插入实体。这种便利性在早期版本的 Hibernate 中很常见,但随着 Hibernate 的发展,它变得不那么必要了。
用 merge() 替换 saveOrUpdate()
merge()
方法将实体与持久化上下文中的现有实体进行比较。如果找到匹配项,它将更新现有实体并返回该实体的托管副本。如果没有找到匹配项,它将插入实体并返回该实体的托管副本。
merge()
方法需要一个托管实体作为参数。这意味着它只能在实体已与持久化上下文关联后才能使用。要关联实体,可以使用 getReference()
或 find()
方法。
示例:
// 假设我们有一个 Person 实体
Person person = new Person();
person.setName("John Doe");
// 使用 merge()
Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
session.merge(person);
session.getTransaction().commit();
用 persist() 替换 saveOrUpdate()
persist()
方法将实体插入数据库。如果实体已经存在于数据库中,它将引发 UniqueIndexOrPrimaryKeyViolationException
。
persist()
方法需要一个非托管实体作为参数。这意味着它只能在实体尚未与持久化上下文关联后才能使用。要取消关联实体,可以使用 detach()
方法。
示例:
// 假设我们有一个 Person 实体
Person person = new Person();
person.setName("John Doe");
// 使用 persist()
Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
session.persist(person);
session.getTransaction().commit();
结论
用 merge()
和 persist()
替换 saveOrUpdate()
需要一些调整,但通过理解这两种方法之间的差异,你可以确保你的代码在 Hibernate 6 中继续平稳运行。
常见问题解答
-
为什么 saveOrUpdate() 被弃用了?
saveOrUpdate()
被弃用是因为它容易出错,而且在大多数情况下,可以使用merge()
或persist()
来替代它。 -
什么时候应该使用 merge()?
当实体可能已经存在于数据库中时,应该使用
merge()
。它将更新现有实体或插入新实体。 -
什么时候应该使用 persist()?
当实体肯定不存在于数据库中时,应该使用
persist()
。它将插入新实体。 -
如何关联实体以使用 merge()?
可以使用
getReference()
或find()
方法来关联实体。 -
如何取消关联实体以使用 persist()?
可以使用
detach()
方法来取消关联实体。