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

时间:2014-06-02 18:27:57

标签: hibernate jpa eclipselink criteria jpa-2.1

如何在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);

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

1 个答案:

答案 0 :(得分:2)

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

如果这不是一个不明原因的选项(也许实体太大而你想在更新时跳过不必要的属性?)考虑将实体拆分为较小的{ {1}}关系),然后您需要手动在提取实体的属性并将其传递给JPA之前在实体上调用这些方法。

@OneToOne