【问题标题】:Execute clean up method of JPA managed entity on deletion删除时执行 JPA 托管实体的清理方法
【发布时间】:2019-03-21 18:33:41
【问题描述】:

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

}

【问题讨论】:

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


【解决方案1】:

由 JPA 管理的 Pojo 称为 Entity。

实体有生命周期回调方法:

@PrePersist/@PostPersist
@PreRemove/@PostRemove
@PreUpdate/@PostUpdate
@PostLoad

@PostConstruct,@PostRemove 是 Spring bean 的回调方法。它永远不会被调用,因为实体不是由 Spring 创建的。 Entity 代表表行数据,它们由 JPA 管理。您在插入数据时使用 new 关键字创建它们。从 DB 读取时,它们是由 JPA 创建的。

【讨论】:

  • CDI 是什么意思?
  • 上下文和依赖注入 (CDI) - java EE 中的依赖注入
【解决方案2】:

您可以使用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

}

【讨论】:

    猜你喜欢
    • 2019-03-16
    • 1970-01-01
    • 2013-02-20
    • 2023-03-14
    • 2011-11-18
    • 2019-03-30
    • 2010-11-12
    • 2013-11-13
    • 1970-01-01
    相关资源
    最近更新 更多