Создайте таблицу Audit с использованием класса Listener In JAVA JPA - PullRequest
0 голосов
/ 30 марта 2020

Мне нужно создать таблицу аудита (не файл), используя JPA (только опция).

Таблица аудита означает, что, скажем, при удалении будет нажата запись в таблицу аудита с указанием имени пользователя, отметки времени, и др c. для целей аудита на потом. Метод, который я использовал, должен иметь класс слушателя для Entity. Класс слушателя будет запускать метод @PreRemove. Это обратный вызов.

@Getter @Setter
@ToString @NoArgsConstructor
@Entity @AllArgsConstructor
@Table(name = "TableToBeAudited")
@EntityListeners(AuditListener.class)
public class TableToBeAudited implements Auditable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
....OTHER COLUMNS HERE
....
transient Audit audit;
@Override
public Audit getAudit() {
audit = new Audit();
audit.setEventType("Postings");
return audit;
}

Определение интерфейса Auditable:

public interface Auditable {
Audit getAudit();
void setAudit(Audit audit);
}

AuditListener. java Class

public class AuditListener {

private AuditRepository auditRepository = new AuditRepository();

@PreRemove
public void persistOnDeletion(Auditable auditable) {
    try {
        Audit audit = auditable.getAudit();
        audit.setEventType("DELETE");
        auditRepository.addAuditEntry(audit);
    }catch(Exception e) {
        System.out.println(e);
    }
}
}

И, наконец, мой AuditRepostory. java

import javax.persistence.PersistenceUnit;
import javax.transaction.Transactional;

@Transactional
@Repository
public class AuditRepository {

@PersistenceUnit(name = "unit")
EntityManagerFactory entityManagerFactory; /*This is coming null here. I have tried EntityManager also with @PersistenceContext. The null is probably because we cannot have another PersistenceContext within one persistenceContext. This is a call back call for the listner.*/

public void addAuditEntry(Audit audit) {
    EntityManager entityManager = entityManagerFactory.createEntityManager();
    entityManager.getTransaction();
    entityManager.persist(audit);
    entityManager.getTransaction().commit();;
}
}

Теперь основной проблемой является EntityManagerfactory или EntityManager, который я подключаю через @PersistenceContext, или @PersistenceUnit подключается к нулю. Я перепробовал все комбинации EntityManagerfactory, EntityManager с PersistenceContext и PersistenceUnit

Мои ожидания:

  1. Решение / Улучшение этого кода.
  2. Новый подход с использованием JPA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...