繁体   English   中英

Spring Data JPA中的复杂而快速的更新

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM