Problemas ao inserir registro nas anotações @PostPersist / @PostUpdate / @PostRemove

Olá Pessoal,

Estou tendo problemas para auditar minhas entidades. Nelas tenho as anotações @PostPersist / @PostUpdate / @PostRemove, aonde eu informo alguns valores e tento salvar em uma tabela de log, porem da erro. Ele passa pelo metodo de insercao da entidade e não chega nem a entrar no metodo de insercao do LOG.

Data Erro tanto colocando o insert na anotação quando mesmo criando um metodo para auxiliar tambem da erro.

Utilizo na minha aplicação JSF, RichFaces, Spring, JPA.

Entidade:

@Entity
@Table(name = "teste")
@NamedQueries({
	@NamedQuery(name = "Teste.findAll", query = "FROM Teste c")
})
public class Teste implements Serializable {
	
    @Id
    @SequenceGenerator( name = "ID", sequenceName = "SEQ_GERAL", allocationSize = 1 )  
	@GeneratedValue( strategy = GenerationType.SEQUENCE, generator = "ID" )  
    @Basic(optional = false)
    @Column(name = "cod_teste")
    private Long codTeste;
    
    @Basic(optional = false)
    @Column(name = "des_teste")
    private String desTeste;
    
	@Type(type = "statusEnumType")
	@Column(name = "status")
    private StatusEnum status;
	
	@Transient
	private Long codEntity = 10L;
	
	@Transient
	@Resource(name = "logDAO")
	private static LogDaoJpa logDao;
	
    public Teste() {
    }

    public Teste(Long codTeste) {
        this.codTeste = codTeste;
    }

    public Long getCodTeste() {
        return codTeste;
    }

    public void setCodTeste(Long codTeste) {
        this.codTeste = codTeste;
    }

    public String getDesTeste() {
        return desTeste;
    }

    public void setDesTeste(String desTeste) {
        this.desTeste = desTeste;
    }

	public StatusEnum getStatus() {
        return status;
    }

    public void setStatus(StatusEnum status) {
        this.status = status;
    }
    
    public Long getCodEntity() {
		return codEntity;
	}

	public void setCodEntity(Long codEntity) {
		this.codEntity = codEntity;
	}

	@PostPersist  >> ERRO <<
    public void onPostInsert(){
		Log log = new Log();
		log.setEntidade(getCodEntity()); 
		log.setRegistro(getCodCor().toString());
		log.setAcao("INSERT");
		log.setUsuario(Util.getUsuario().getIdUsu());
		log.setData(new Date());
		logDao.store(log);
    }
    
    @PostUpdate  >> ERRO <<
    public void onPostUpdate(){
    	Util.gravaLog(getCodEntity(), getCodEntity(), getCodCor().toString(), "UPDATE");
    }
    
    @PostRemove >> ERRO <<
    public void onPostDelete(){
    	Util.gravaLog(getCodEntity(), getCodEntity(), getCodCor().toString(), "DELETE");
    }
    
    @Override
    public int hashCode() {
        int hash = 0;
        hash += (codCor != null ? codTeste.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        if (!(object instanceof Cores)) {
            return false;
        }
        Testeother = (Teste) object;
        if ((this.codTeste == null && other.codTeste != null) || (this.codCor != null && !this.codTeste.equals(other.codTeste))) {
            return false;
        }
        return true;
    }

}

Erro:

12:16:13,296 ERROR [application] org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Error while commiting the transaction
javax.faces.el.EvaluationException: org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Error while commiting the transaction
	at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:102)
	at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
	at br.com.caras.isca.listener.ExceptionHandler.processAction(ExceptionHandler.java:16)
	at javax.faces.component.UICommand.broadcast(UICommand.java:387)
	at org.ajax4jsf.component.AjaxViewRoot.processEvents(AjaxViewRoot.java:321)

Alguem tem alguma ideia ?

Obrigado,
Rodrigo

esta faltando coesão nessa sua abordagem… coloque as triggers (ou seja os metodos de gatilho) em outra classe

@Entity @Table(name = &quot;teste&quot;) @NamedQueries({ @NamedQuery(name = &quot;Teste.findAll&quot;, query = &quot;FROM Teste c&quot;) }) @EntityListeners(TesteListener.class) public class Teste implements Serializable { //.... }

[code]public class TesteListener {
@PostPersist >> ERRO <<
public void onPostInsert(Teste teste){
Log log = new Log();
log.setEntidade(teste.getCodEntity());
log.setRegistro(teste.getCodCor().toString());
log.setAcao("INSERT");
log.setUsuario(Util.getUsuario().getIdUsu());
log.setData(new Date());
logDao.store(log);
}

 @PostUpdate  &gt;&gt; ERRO &lt;&lt;  
 public void onPostUpdate(Teste teste){  
     Util.gravaLog(getCodEntity(), getCodEntity(), getCodCor().toString(), &quot;UPDATE&quot;);  
 }  
   
 @PostRemove &gt;&gt; ERRO &lt;&lt;  
 public void onPostDelete(Teste teste){  
     Util.gravaLog(getCodEntity(), getCodEntity(), getCodCor().toString(), &quot;DELETE&quot;);  
 } [/code]

Valeu pela dica Lavieri,

Porem, tanto na versão anterior quanto nessa, quando eu injeto a anotação para o “LogDAO” ele vem sempre null, nessa o codigo da entidade já vem informado.

Será que o Spring tem alguma restrição de injetar algum componente em um Entity ? Pois os mesmos ja funcionam normalmente mas classes Managers…

Tens alguma ideia ?

Obrigado,
Rodrigo

ele vai ter dificuldade de injetar em um campo estatico sim…

o problema é que quem vai criar essas classes é o JPA =/ … então não da pra injetar via construtor… tente colocar em um campo não estatico, que ai pode dar certo

assim

@Resource(name = “logDAO”)
private LogDaoJpa logDao;