java - 在 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 的所有组合
我的期望:
- 对此代码的解决方案/改进。
- 使用 JPA 的新方法
解决方案
推荐阅读
- scala - 如何使用依赖路径的类型类
- azure-cosmosdb - What happens if I loop indefinitely in a stored procedure?
- algorithm - 你能说出这个音频压缩算法的名字吗?
- java - 在 Java 中将字符串解析为双精度时出错
- google-cloud-platform - Google Cloud Datastore - 插入一个请求后获取
- python-3.x - 无法使用 Python 和 Cerberus 验证重复值的列表
- dll - VS2019项目在运行时加载一个dll而不是使用静态库
- razor - 链接在本地索引页面上有效,但在部署时无效
- mysql - 命令跟踪用户回滚并查看哪个用户正在提交最大手动回滚
- c# - 如何为 ASP.NET core 2.1 项目启用外部连接?