我有一个名为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
界面或一些自定义界面,如果答案是自定义界面,如何注册?
答案 0 :(得分:0)
好的,提出这个问题的主要原因是错误的假设,我认为在程序中获取和更新实体可能会导致性能问题,但正如@JBNizet所提到的,通过id获取实体很快,而且Hibernate处理持久更改实体,无需手动调用save
。
简而言之,提出保存管理实体的新方法并不有用,而且更好地手动避免更新实体,但如果想要手动扩展Jpa存储库,则{{3}正如评论中提到的那样解释它。