我有一个由JPA管理的POJO,它在一个@PostConstruct
带注释的方法中创建了一个外部资源(通过HTTP消息)。当像这样em.delete(instance)
删除该实体时,我希望调用cleanUp方法。我以为这很可能可以通过JPA提供的注释来完成,但是我的搜索没有任何结果。下面是一个示例实体。
@Entity
public class ExampleEntity {
// Constructors and Fields
@JpaAnnotation
public void cleanUp() {
// Performs clean up
}
// Methods
}
显示我如何使用cleanUp方法的另一个示例。
@Entity
@Component
public class ExampleEntity {
// Id and managed columns
private String externalResourceId;
@Transient
private static CustomHttpService service;
// Constructors
@Autowired
public void setCustomHttpService(CustomHttpService service) {
ExampleEntity.service = service;
}
// Methods
@PostConstruct
public void createExternalResource() {
if (externalResourceId == null || externalResourceId.isEmpty()) {
externalResourceId = service.createExternalResource();
}
}
@JpaAnnotation
public void deleteExternalResource() { // This is my example of the cleanUp method
service.deleteExternalResource(externalResourceId);
}
}
答案 0 :(得分:2)
由JPA管理的Pojo称为Entity。
实体具有生命周期回调方法:
@PrePersist/@PostPersist
@PreRemove/@PostRemove
@PreUpdate/@PostUpdate
@PostLoad
@ PostConstruct,@ PostRemove是Spring bean的回调方法。永远不会调用它,因为实体不是由Spring创建的。实体表示表行数据,它们由JPA管理。您在插入数据时使用new
关键字创建它们。从数据库读取数据时,它们是由JPA创建的。
答案 1 :(得分:1)
您可以使用EntityListener
来跟踪实体状态,还可以检查休眠documentation。
首先,您需要使用注释创建EntityListener:
public class UserListener {
@PreRemove
public void userPreRemove(User ob) {
System.out.println("Listening User Pre Remove : " + ob.getName());
}
@PostRemove
public void userPostRemove(User ob) {
System.out.println("Listening User Post Remove : " + ob.getName());
}
}
然后,您指定应审核哪个实体:
@Entity
@EntityListeners(UserListener.class)
@Table(name="user")
public class User {
private String name;
// Attributes, getters and setters
}