Interceptando métodos do JPA EntityManager

2 respostas
M

Olá,

estou tentando configurar no Spring um interceptador para alguns métodos do EntityManager (merge e persist), pois preciso fazer algumas
operações sobre as entidades no momento da gravação.

Fiz uma extensa pesquisa no google sobre algo do tipo, mas não consegui encontrar nada que me ajudasse.

Não está funcionando, não consigo que o método do interceptador seja chamado (inicialmente estou testando apenas o método merge)
Segue o código que estou usando:

<bean id="saveInterceptor" class="br.com.mvn.SaveInterceptor" />
<aop:config>	
	<aop:aspect id="saveAspect" ref="saveInterceptor">
		<aop:pointcut expression="execution(* javax.persistence.EntityManager.merge(*))" id="mergePointCut"/>
		<aop:around method="interceptSave" pointcut-ref="mergePointCut"/>
	</aop:aspect>
</aop:config>

    public Object interceptSave(ProceedingJoinPoint jp) throws Throwable {
	System.out.println("Object about to be persisted: " + jp.getArgs()[0]);
	return jp.proceed();		
}

Já fiz testes tirando do pointcut a interface (javax.persistence.EntityManager) e deixando apenas o merge.
Consigo interceptar por exemplo uma classe minha que tenha um método merge, funciona perfeitamente.
Mas para o EntityManager, não vai…

Alguém já precisou fazer algo do tipo?

Valew,

MV.

2 Respostas

yorgan

Você pode criar um interceptor diretamente no seu Bean utilizando @EntityListeners.
Segue um exemplo:

Bean:

@Entity
@EntityListeners( { SeuListener.class })
public class Entidade {

   @Id
   private Integer id;
   
   //..demais atributos...

}

SeuListener:

public class SeuListener{

    @PrePersist
    public void processarDocumento(Entidade entidade ) {
        System.out.println(entidade .id);
    }
}

Você ainda pode utilizar @PostPersist, @PostUpdate, @PostLoad

Era isso que você precisava?

[]´s
Daniel

M

Daniel,

esta é uma forma de resolver.

O problema desta abordagem é que eu tenho que registar o listener em cada uma das minhas entidades.
Eu gostaria de algo que não dependesse de alterações no meu domain, que ficasse “à parte” do meu código de negócios.
Por isto, usar AOP seria uma saída mais eficaz.

Valew,
[]s

MV.

Criado 9 de outubro de 2010
Ultima resposta 12 de out. de 2010
Respostas 2
Participantes 2