返回

Hibernate 6 弃用 saveOrUpdate():使用 merge() 和 persist() 代替

java

告别 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 中继续平稳运行。

常见问题解答

  1. 为什么 saveOrUpdate() 被弃用了?

    saveOrUpdate() 被弃用是因为它容易出错,而且在大多数情况下,可以使用 merge()persist() 来替代它。

  2. 什么时候应该使用 merge()?

    当实体可能已经存在于数据库中时,应该使用 merge()。它将更新现有实体或插入新实体。

  3. 什么时候应该使用 persist()?

    当实体肯定不存在于数据库中时,应该使用 persist()。它将插入新实体。

  4. 如何关联实体以使用 merge()?

    可以使用 getReference()find() 方法来关联实体。

  5. 如何取消关联实体以使用 persist()?

    可以使用 detach() 方法来取消关联实体。