一尘不染

JPA-如果不存在创建实体?

hibernate

我的JPA / Hibernate应用程序中有几个映射的对象。在网络上,我收到的数据包代表这些对象的更新,或者实际上可能完全代表新的对象。

我想写一个像

<T> T getOrCreate(Class<T> klass, Object primaryKey)

如果数据库中存在一个带有pk primaryKey的对象,则该对象将返回所提供类的一个对象,否则将创建该类的新对象,并将其持久化并返回。

接下来我将要处理的对象是在事务中更新其所有字段。

在JPA中是否有惯用的方法来执行此操作,还是有更好的方法来解决我的问题?


阅读 302

收藏
2020-06-20

共1个答案

一尘不染

  1. 创建一个EntityManager实例(我们称其为“ em”),除非您已经有一个活动实例
  2. 创建一个新交易(我们称之为“ tx”)
  3. 调用em.find(Object pk)
  4. 致电tx.begin()
    • 如果find()返回了非null的实体引用,则需要进行更新。将您的更改应用于返回的实体,然后调用em.merge(对象实体)。
    • 如果find()返回空引用,则该PK在数据库中不存在。创建一个新实体,然后调用em.persist(Object newEntity)。
  5. 呼叫em.flush()
  6. 致电tx.commit()
  7. 根据您的方法签名返回您的实体引用。
2020-06-20