Мне нужно создать таблицу аудита (не файл), используя 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
Мои ожидания:
- Решение / Улучшение этого кода.
- Новый подход с использованием JPA