当前位置: 首页 > 知识库问答 >
问题:

如何在Spring JPA中实现实体?实现或创造新的?

柳业
2023-03-14

我想知道在Spring项目中更新JPA实体的最佳实践是什么-更新原始实体还是创建新实体?我看到了这两种方法:

  1. 使用原始-在原始实体中实现必要的字段,并将更新后的实体保存回存储库
  2. 使用复制-手动创建实体的新实例,将原始实体中的所有字段(更新的字段)设置为新实体,并将实体保存回存储库

您使用/推荐什么方法?为什么呢?

共有2个答案

汝彭薄
2023-03-14

获取实体,然后仅更新该实体是最简单的方法。此外,这比创建副本更快,因为 EntityManager 管理实体并知道托管实体已存在于数据库中(因此无需执行其他查询)。

不管怎样,还有第三种也是最快的方法:对< code>Query对象使用< code>executeUpdate。

entityManager
    .createQuery("update EntityName set fieldName = :fieldName where id = :id")
    .setParameter("fieldName", "test")
    .setParameter("id", id)
    .executeUpdate();

由于绕过持久上下文,所以速度更快

滕胜涝
2023-03-14

当涉及到更新时,标准的方法是检索实体引用(阅读下文)并在事务方法中进行更改:

private JpaRepository repo;

@Transactional(readOnly = false)
public void performChanges(Integer id){
     Entity e = repo.getOne(id);

     // alter the entity object
}

关于这个例子的一些事情:

  • 您可能希望尽可能多地使用JpaRepostorygetOne方法,因为它通常比CrudRepostoryfindOne快。唯一的技巧是您必须确保该实体确实存在于具有给定id的数据库中。否则您会得到异常。findOne方法不会发生这种情况,因此您需要对更改应用程序中单个实体的每个事务方法做出决定。
  • 您不需要在EntityManager上触发任何持久化保存方法,因为当事务提交时,更改将自动刷新…并且在方法返回时。

关于您的第二个选项,我认为这没什么用,因为无论如何您都需要使用上述方法获取数据。如果您打算在事务之外使用该实体,则可以再次使用从上面的示例检索到的实体,然后在事务上下文中再次需要它时执行合并,从而执行持久性提供程序。

 类似资料:
  • 问题内容: 当业务层创建一个新的实体时,该实体在逻辑上表示应该更新的现有实体的实例(例如,它们共享相同的业务密钥),这是合并不良做法的方法吗? 我问是因为在分离的实体上显式设置ID对我来说很奇怪,但是即使User实体的equals和hashcode方法得到了适当实现,在这里设置ID是确保合并发生的唯一方法。 有更好的做法吗? 此方法是否有特定的缺点,以后会困扰我? 谢谢参观! 问题答案: 该代码将

  • 问题内容: 我正在学习Java,但是在和接口上找不到任何好的解释。 当我实现an时,我的Eclipse IDE创建了一个方法。 我可以在没有界面的情况下关闭流。但是,我不明白如何使用接口实现该方法。而且,此接口的目的是什么? 我也想知道:如何检查是否真的关闭? 我正在使用下面的基本代码 问题答案: 在我看来,您对接口不是很熟悉。在您发布的代码中,您无需实现。 您仅需要(或应该)实现,或者如果您将要

  • 我有一个使用和的Spring Boot应用程序。您可以在这个GitHub存储库中找到整个代码。 我的问题是,如何在没有任何外键的情况下,通过使用结构向特定列添加国际化功能? 例如,我想定义一个JPA实体,如下所示: 然后,对于和地区,列中的数据将按如下方式存储: 然后,当当前区域设置为Köln时,当设置为区域设置时,则在读取数据时获取数据! 此外,当我们存储数据时,传递的字符串以JSON格式存储在

  • 我试图理解为什么persist()的行为在许多情况下是不同的,首先是持久化一个新实体,其次是修改该实体。我的测试设置有一名员工,他与部门有一个单向的多人对话;部门与员工之间没有关系。对于测试,我在Employee中的Department字段上没有任何级联注释。 我发现,在创建员工时,我必须调用em.persist(dept),否则dept实例不会持久化,我会得到一个异常。因此,我调用em.pers

  • 我在删除联接表中引用的实体时遇到问题。以下是三个链接的enitie。 当我尝试使用CrudRepository从来宾表中删除来宾时,它会给我这个错误。 错误:表“guest”上的更新或删除违反了表“guest\u group\u join”上的外键约束“FKKOUGVMCU860MOUACR1SHJXY”。键(id)=(4)仍然从表“guest\u group\u join”中引用。 有人能帮忙吗