2015-01-14 2 views
2

У меня есть слушатель с методом @PostPersist под названием «doAudit» для аудита create action.On для отладки. Я вижу, что этот метод вызывается, а запись аудита создается на стороне JAVA. Но когда я проверяю БД, я не вижу запись.@PostPersist не сохраняет запись аудита в БД

public class AuditListener { 
    @PostPersist 
    public void doAudit(Object object) { 
     AuditDao auditManager = AuditDaoImpl.getInstance(); 
     auditManager.logEvent("create", object); 
    } 
} 

public interface AuditDao { 
    @Transactional(propagation= Propagation.REQUIRED) 
    public AuditEntity logEvent(String action, Object object); 
} 

@Component 
public class AuditDaoImpl implements AuditDao { 

    private static AuditDaoImpl me; 

    public AuditDaoImpl() { 
     me = this; 
    } 

    public static AuditDaoImpl getInstance() { 
     return me; 
    } 

    @Autowired 
    private AuditDao dao; 

    @Transactional 
    @Override 
    public AuditEntity logEvent(String action, Object object) { 

     AuditEntity act = new AuditEntity(); 
     act.setAction(action); 
     act.setObject(object); 

     dao.create(act); 
     return act; 
    } 
} 

Я использую Open JPA 2.0 как для своего ОРМ. Развертывается на контейнере. Я использую Postgres SQL в качестве моего бэкэнд.

ответ

0

Добавить контрольную точку отладки и проверить, содержит ли текущая трассировка стека TransactionInterceptor. Если такой записи нет, управление транзакциями Spring неправильно настроено, и ваши DAO вообще не используют транзакции.

JPA позволяет запускать запросы без прямой настройки транзакций. Для сохранения данных транзакции являются обязательными.

+0

Я буду отлаживать и искать TransactionInterceptor. Интересно, когда я меняю PostPersist на PrePersist, запись аудита сохраняется в DB, ​​но я хочу, чтобы она работала на PostPersist. благодаря – auhuman

Смежные вопросы