Выполнить метод очистки управляемого объекта JPA при удалении - PullRequest
0 голосов
/ 21 марта 2019

У меня есть POJO, управляемый JPA, который создает внешний ресурс (через HTTP-сообщение) внутри аннотированного метода @PostConstruct.Когда эта сущность удаляется примерно так 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 ]

2 голосов
/ 21 марта 2019

Pojo, управляемый JPA, называется Entity.

У объекта есть методы обратного вызова жизненного цикла:

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

@ PostConstruct, @PostRemove - это метод обратного вызова для бинов Spring.Он никогда не будет вызван, потому что объекты не создаются Spring.Сущность представляет данные строки таблицы, они управляются JPA.Вы создаете их, используя ключевое слово new при вставке данных.При чтении из БД они создаются JPA.

1 голос
/ 21 марта 2019

Вы можете использовать EntityListener для отслеживания состояний объектов, вы можете проверить документацию в спящем режиме .

Сначала вам нужно создать 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

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...