删除时执行JPA管理实体的清理方法

时间:2019-03-21 18:33:42

标签: java spring-boot jpa spring-data-jpa

我有一个由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);
    }

}

2 个答案:

答案 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

}