如何在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
(或@PreRemove
,CriteraUpdate
)修饰的方法?
答案 0 :(得分:2)
您未将该实体传递给JPA。您只是提取单个实体属性并将它们传递给JPA。为了获得JPA调用的实体@PreUpdate
和朋友,您需要像往常一样将EntityManager#merge()
传递给JPA。
如果这不是一个不明原因的选项(也许实体太大而你想在更新时跳过不必要的属性?)考虑将实体拆分为较小的{ {1}}关系),然后您需要手动在提取实体的属性并将其传递给JPA之前在实体上调用这些方法。
@OneToOne