我想知道在Spring项目中更新JPA实体的最佳实践是什么-更新原始实体还是创建新实体?我看到了这两种方法:
您使用/推荐什么方法?为什么呢?
获取实体,然后仅更新该实体是最简单的方法。此外,这比创建副本更快,因为 EntityManager
管理实体并知道托管实体已存在于数据库中(因此无需执行其他查询)。
不管怎样,还有第三种也是最快的方法:对< code>Query对象使用< code>executeUpdate。
entityManager
.createQuery("update EntityName set fieldName = :fieldName where id = :id")
.setParameter("fieldName", "test")
.setParameter("id", id)
.executeUpdate();
由于绕过持久上下文,所以速度更快
当涉及到更新时,标准的方法是检索实体引用(阅读下文)并在事务方法中进行更改:
private JpaRepository repo;
@Transactional(readOnly = false)
public void performChanges(Integer id){
Entity e = repo.getOne(id);
// alter the entity object
}
关于这个例子的一些事情:
JpaRepostory
的getOne
方法,因为它通常比CrudRepostory
的findOne
快。唯一的技巧是您必须确保该实体确实存在于具有给定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”中引用。 有人能帮忙吗