3

如何在 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(or @PrePersist, ) 修饰的方法?@PreRemoveCriteraUpdate

4

1 回答 1

2

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

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

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

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
// ...
于 2014-06-03T08:12:07.623 回答