PAGUE 6 MESES
LEVE 12 MESES
GARANTIR DESCONTO

Fórum Problema com loop infinito em @PreUpdate JPA 2 #455788

18/09/2013

0

Pessoal, estou com um problema, já faz alguns dias que estou pesquisando em fóruns, mas não encontrei nenhuma solução para o problema que vou explicar:
Tenho uma classe que realiza o update de uma entidade atravéz do merge do jpa, o método executeOperation recebe a entidade já alterada e o EntityManager, e realiza o merge.
public class UpdatePatient implements CaseRules{

	@Override
	public ResponseExecution executeOperation(Object entity, EntityManager em) throws BaseException {
		Patient patient = (Patient) entity;

		ResponseExecution response = new ResponseExecution();

		em.merge(patient);

               ...

Tenho uma classe cujo o método preUpdate é anotado com @PreUpdate, o método faz a chamada para uma classe ''especialista'' que faz a verificação de duplicidade:
public class PatientListener {

	private PatientServicesLocal patientService;

	@PrePersist
	public void prePersist(Patient patient) throws BaseException {
          ...
	}

	@PreUpdate
	public void preUpdate(Patient patient) throws BaseException {

        //Realiza a chamada da classe responsável pela consulta...

		patientService = (PatientServicesLocal) ServicesProviderByLookup
				.getServicesByClassServices(PatientService.class);
		patientService.execute(Constants.VERIFY_EXISTS_PATIENT_RULE, patient);

	}

	@PreRemove
	public void preRemove(Patient patient) throws BaseException {
         ...

	}

}

A Classe acima (PatientListener) no método preUpdate faz a chamada da classe responsável pela consulta:
public class VerifyExistsPatient implements CaseRules {
@Override
	public ResponseExecution executeOperation(Object entity, EntityManager em)
			throws BaseException {

		ResponseExecution response = new ResponseExecution();
		CriteriaBuilder builder = em.getCriteriaBuilder();
		CriteriaQuery<Patient> cq = builder.createQuery(Patient.class);
		Root<Patient> patientRoot = cq.from(Patient.class);
		List<Predicate> predicate = new ArrayList<Predicate>();

		// Obtém por reflection os atributos que foram preenchidos em tela
		ReflectionUtil ru = new ReflectionUtil(entity);
		Map<Object, Object> filledAttrs = ru.getFilledAttributes();

		// Preenchendo dinamicamente as condições da consulta
		for (Object key : filledAttrs.keySet()) {

				predicate.add(builder.equal(patientRoot.get(key.toString()),
						filledAttrs.get(key)));
		}
		cq.where(predicate.toArray(new Predicate[predicate.size()]));
		List<Patient> result = em.createQuery(cq).getResultList();
                ...

O problema que estou tendo, é que no momento que o listener é acionado, o método com a anotação @PreUpdate executa o código acima (VerifyExistsPatient), e no momento em que o em.createQuery(cq).getResultList() é executado, meu código entra em um loop infinito e fica executando sem parar o PreUpdate e consequentemente a classe VerifyExistsPatient.

Alguém já passou por isso, ou sabe o que está acontecendo ??


Marcos Ferreira

Marcos Ferreira

Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar