2015-01-14 1 views
2

작성 작업을 감사하기 위해 "doAudit"이라는 @PostPersist 메소드가있는 수신기가 있습니다. 디버깅 중입니다.이 메소드가 호출되고 JAVA 측에서 감사 레코드가 생성됩니다. 하지만 DB를 확인할 때 기록이 보이지 않습니다.@PostPersist는 감사 레코드를 DB에 저장하지 않습니다.

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

내 ORM은 Open JPA 2.0을 사용하고 있습니다. 카라프 컨테이너에 배치. 내 백엔드로 Postgres SQL을 사용하고 있습니다.

답변

0

디버그 중단 점을 추가하고 현재 스택 추적에 TransactionInterceptor이 포함되어 있는지 확인하십시오. 그런 엔트리가 없다면 Spring 트랜잭션 관리가 제대로 설정되지 않았고 DAO는 트랜잭션을 전혀 사용하지 않는다.

JPA를 사용하면 트랜잭션을 명시 적으로 구성하지 않고도 쿼리를 실행할 수 있습니다. 데이터 저장의 경우 거래가 필수입니다.

+0

디버깅하고 TransactionInterceptor를 찾습니다. 한 가지 흥미로운 점은 PostPersist를 PrePersist로 변경하면 감사 레코드가 DB에 저장되지만 PostPersist에서 작업하기를 원합니다. 감사 – auhuman