gpt4 book ai didi

hibernate - 如何在 JPA 2.1 中进行批量更新、删除、插入时调用回调方法,如@PreUpdate、@PrePersist、@PreRemove?

转载 作者:行者123 更新时间:2023-12-02 01:48:53 25 4
gpt4 key购买 nike

如何在JPA 2.1中调用@PreUpdate(包括@PrePersist@PreRemove等)注解的方法?以下面的 CriteriaUpdate 查询为例:

Brand brand=//... Populated by client. The client is JSF in this case.
byte[] bytes=//... Populated by client. The client is JSF in this case.

CriteriaBuilder criteriaBuilder=entityManager.getCriteriaBuilder();
CriteriaUpdate<Brand>criteriaUpdate=criteriaBuilder.createCriteriaUpdate(Brand.class);
Root<Brand> root = criteriaUpdate.from(entityManager.getMetamodel().entity(Brand.class));

criteriaUpdate.set(root.get(Brand_.brandName), brand.getBrandName());
criteriaUpdate.set(root.get(Brand_.category), brand.getCategory());
criteriaUpdate.set(root.get(Brand_.brandImage), bytes);
criteriaUpdate.where(criteriaBuilder.equal(root, brand));
entityManager.createQuery(criteriaUpdate).executeUpdate();

给定关联实体中由 @PreUpdate 修饰的方法 - Brand

@Column(name = "last_modified")
@Temporal(TemporalType.TIMESTAMP)
private Date lastModified; //Getter and setter.


@PreUpdate
public void onUpdate() {
lastModified = new Date();
System.out.println("lastModified = "+lastModified);
}

此方法仅在使用更新行时调用

entityManager.merge(brand);

当相关操作涉及标准 API 时,如何调用由 @PreUpdate(或 @PrePersist@PreRemove)修饰的方法CriteraUpdate?

最佳答案

您没有将实体传递给 JPA。您只是提取单个实体属性并将它们传递给 JPA。为了得到实体的@PreUpdate和 JPA 调用的 friend ,您需要将整个实体传递给 JPA,就像往常一样 EntityManager#merge() .

如果出于某些不明确的原因这不是一个选项(也许实体太大并且您想跳过不必要的属性不被更新?在这种情况下,考虑将实体拆分为更小的 @OneToOne 关系),然后在提取实体的属性并将其传递给 JPA 之前,您需要在实体上手动调用这些方法。

Brand brand = ...
brand.onUpdate();
byte[] bytes = ...

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
// ...

关于hibernate - 如何在 JPA 2.1 中进行批量更新、删除、插入时调用回调方法,如@PreUpdate、@PrePersist、@PreRemove?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24000983/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com