[英]Complex and fast update in spring data jpa
我有一个名为Product
的实体。 它具有多个字段,用户可以任意更新一个或多个字段。 为了更新Product
,我知道我可以从数据库获取持久性产品并更新它的字段并再次save
,但这会造成实际的性能损失。 更好的方法是在ProductRepostory
界面中创建自定义更新查询,但是在这种情况下,我应该为每种情况编写多个更新功能。 我想获取更新字段及其值的Map<String,Object>
,并编写查询以按比例更新主题。
我听说Hibernate能够创建自定义更新查询并执行以下代码
@Stateless
@LocalBean
public class OrderManagement {
@PersistenceContext
private EntityManager em;
...
public void updateOrder(Double oldAmount, Double newAmount) {
CriteriaBuilder cb = this.em.getCriteriaBuilder();
// create update
CriteriaUpdate<Order> update = cb.
createCriteriaUpdate(Order.class);
// set the root class
Root e = update.from(Order.class);
// set update and where clause
update.set("amount", newAmount);
update.where(cb.greaterThanOrEqualTo(e.get("amount"), oldAmount));
// perform update
this.em.createQuery(update).executeUpdate();
}
}
但是我想知道如何在spring数据jpa情况下使用此功能,最大的问题是如何获取EntityManager实例,下一个是放置此功能的最合适位置在哪里? ProductRepostory
界面或某些自定义界面,而答案是自定义界面,该如何注册?
好的,问这个问题的主要原因是一个错误的假设,即我认为在程序中获取和更新实体可能会导致性能问题,但是正如@JBNizet所提到的那样,通过id获取实体非常快,而且Hibernate可以处理持久化的更改。实体,无需手动调用save
。
简而言之,提出一种新的方法来保存可管理的实体并不可行,并且最好手动避免更新实体 ,但是如果要手动扩展Jpa存储库,那么有一篇很好的文章可以对此进行解释,正如评论中提到的那样。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.