首页 > 解决方案 > 在 JAVA JPA 中使用 Listener 类创建审计表

问题描述

我需要使用 JPA(仅选项)创建一个审计表(不是文件)

审计表的意思是,在删除事件时,将推送审计表的条目,说明用户名、时间戳等,以供以后审计。我使用的方法是为实体创建一个侦听器类。侦听器类将触发 @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;
}

可审计接口定义:

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

AuditListener.java 类

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();;
}
}

现在主要问题是我通过@PersistenceContext 或@PersistenceUnit 连接的EntityManagerfactory 或EntityManager 连接到null。我已经尝试了 EntityManagerfactory、EntityManager 与 PersistenceContext 和 PersistenceUnit 的所有组合

我的期望:

  1. 对此代码的解决方案/改进。
  2. 使用 JPA 的新方法

标签: javajpa

解决方案


推荐阅读