当前位置: 首页 > 面试题库 >

JPA-创建不存在的实体?

裴俊迈
2023-03-14
问题内容

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

我想写一个像

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

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

接下来,我将使用该对象来更新事务中的所有字段。

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


问题答案:
  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. 根据您的方法签名返回您的实体引用。


 类似资料:
  • 问题内容: 我的JPA / Hibernate应用程序中有几个映射的对象。在网络上,我收到的数据包代表这些对象的更新,或者实际上可能完全代表新的对象。 我想写一个像 如果数据库中存在一个带有pk primaryKey的对象,则该对象将返回所提供类的一个对象,否则将创建该类的新对象,并将其持久化并返回。 接下来我将要处理的对象是在事务中更新其所有字段。 在JPA中是否有惯用的方法来执行此操作,还是有

  • Java类可以很容易地转换成实体。 对于实体转换,基本要求是 - 无参数构造函数 注解 在这里,我们将学习如何通过示例,学习将常规Java类转换为实体类 - 简单的一个学生类(Student),代码如下 - 上面的类是一个常规的java类,有三个属性: , 和 。要将此类转换为实体,请在此类中添加和注解。 - 这是一个标记注释,表明这个类是一个实体。这个注释必须放在类名称上。 - 此注释位于持有持

  • 问题内容: 我已经使用JPA(实现hibernate)一段时间了,每次我需要创建实体时,我都会遇到与AccessType,不可变属性,equals / hashCode等有关的问题。 因此,我决定尝试找出每个问题的最佳常规做法,并写下来供个人使用。 但是,我不介意让任何人对此发表评论或告诉我我错了。 实体类 实现可序列化 原因: 规范要求您必须这样做,但是某些JPA提供程序没有强制执行此操作。 作

  • 问题内容: 我正在使用Spring + Hibernate+JPA,但遇到无法将实体持久保存到数据库的情况。我已经建立了一个带有@Transactional注释的服务类。它使用包含注入的EntityManager的DAO。当我在服务对象上调用函数时,我看到DAO正在进行大量的选择读取,但是由于我的DAO发出的合并和删除操作,没有更新/删除。当然,我的设置有问题,但是我看不到它。 persisten

  • 所以我从JDBC转移到JPA,我从我的schema.sql文件中删除了“创建表”sql语句,所以现在这个文件看起来像这样: 我的实体,成员。课堂上,是这样的: 以下是我得到的例外: 如您所见,它表示找不到表成员。如果我将“createtablemember”sql语句带回模式。sql文件,也不例外 我在Eclipse上使用Spring Boot。 谢谢!

  • 我目前正在为文件管理服务器开发RecycleBin组件。删除文档时,将从多个位置删除所有版本。出现这种情况时,所有文件夹路径将被删除到重复字符串dp\u original\u folder\u paths。 我想在文件夹路径不存在时创建它。 这是我当前的代码。第一部分检查文件是否存在,如果没有创建它。第二部分显示文档被重新链接到文件夹。 给出的输出为 创建目录:\EAM\sbotest 已创建目录