Spring Hibernate Envers: изменяемая сущность захвата - PullRequest
0 голосов
/ 27 февраля 2020

Возможно ли захватить объект (Книгу), который изменяется внутри CustomEntityTrackingListener или CustomRevisionListener?

Я пытаюсь получить всю информацию, которая передается через apis / saveBook или / update / {id} / {pages}, а не только информация о ревизии.

При аудите сущности в envers он автоматически создает таблицу _AUD для каждой сущности и таблицу ревизий для соединения сущности и ее таблицы _AUD

Используя пользовательский прослушиватель ревизии, я могу получить только информацию о ревизии, но мне бы хотелось, чтобы сама сущность изменялась и сохранялась.

...
    @PostMapping("/saveBook")
    public Book saveBook(@RequestBody Book book) {
        return repository.save(book);
    }

    @PutMapping("/update/{id}/{pages}")
    public Book updateBook(@PathVariable int id, @PathVariable int pages) {
        Book book = repository.findById(id).get();
        book.setPages(pages);
        return repository.save(book);
    }
...
@Entity
@AllArgsConstructor
@NoArgsConstructor
@Data
@Audited
public class Book {

    @Id
    @GeneratedValue
    private int id;

    private String name;

    private int pages;
}

@Entity
//@RevisionEntity(ExampleListener.class)
@RevisionEntity(CustomEntityTrackingRevisionListener.class)
public class ExampleRevEntity extends DefaultRevisionEntity {


    private String username;


    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    @OneToMany(mappedBy="revision", cascade={CascadeType.PERSIST, CascadeType.REMOVE})
    private Set<ModifiedEntityTypeEntity> modifiedEntityTypes =
            new HashSet<ModifiedEntityTypeEntity>();

}



public class ExampleListener implements RevisionListener {

    @Override
    public void newRevision(Object revisionEntity) {
        ExampleRevEntity exampleRevEntity = (ExampleRevEntity) revisionEntity;
        //Identity identity = (Identity) Component.getInstance("org.jboss.seam.security.identity");

        exampleRevEntity.setUsername("Joaquin");
    }
}
public class CustomEntityTrackingRevisionListener implements EntityTrackingRevisionListener {
    @Override
    public void entityChanged(Class entityClass, String entityName,
                              Serializable entityId, RevisionType revisionType,
                              Object revisionEntity) {

        String type = entityClass.getName();
        //((CustomTrackingRevisionEntity)revisionEntity).addModifiedEntityType(type);
        ((ExampleRevEntity)revisionEntity).addModifiedEntityType(type);
    }

    @Override
    public void newRevision(Object revisionEntity) {

    }

}

1 Ответ

0 голосов
/ 18 марта 2020

Есть несколько способов сделать это sh.

  • Представьте собственных слушателей событий
  • Используйте технологию CD C (изменение захвата данных), такую ​​как Debezium. .

При первом подходе вы, вероятно, захотите следовать рекомендациям в документации Envers о том, как вы будете выполнять условный аудит, и представить настраиваемые прослушиватели событий, которые расширяют прослушиватели Envers, чтобы вывести изменения и выполняйте любые задачи, которые вам нужны.

Это может быть очень сложным и утомительным шагом, потому что вы должны понимать, как Hibernate генерирует свои данные в событиях, как разрешать различия, и так далее c.

Я полагаю, что более простым подходом здесь было бы использование такого инструмента, как Debezium, который позволяет вам настраивать задание, которое отслеживает настроенное количество таблиц, в вашем случае - конкретные таблицы c _AUD интерес. Каждый раз, когда Envers вставляет в эти таблицы, Debezium реагирует на вставку, генерируя событие, на которое вы затем можете реагировать асинхронно.

Debezium имеет несколько способов использования, в том числе встроенных в приложение, которое может подходить для ваш вариант использования или экземпляр Kafka Connect, который отделен от приложения и обеспечивает избыточность и отказоустойчивость для захвата и отправки событий.

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