es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Obtener el entityManager actual al ejecutar métodos en ciertos repositorios.

Estoy intentando recuperar el entityManager actual al llamar métodos desde cierto repo. ¿Tienes alguna idea de cómo podría fusionar estos 2 puntos de corte?

@Pointcut("execution(* com.package.repository.MyRepo.*(..))")
public void insideRepository() {}

@Pointcut("execution(* javax.persistence.EntityManagerFactory+.createEntityManager(..))")
public void createEntityManager() {}

@Before("insideRepository()")
public void enableFilter(JoinPoint jp) {
    System.out.println("Dentro del repo");
}

@AfterReturning(pointcut = "createEntityManager()", returning = "entityManager")
public void enableFilter(EntityManager entityManager) {
    try {
        entityManager.unwrap(Session.class).enableFilter("myFilter");
    } catch (Exception e) {
        System.out.println("No existe el filtro myFilter para esta entidad");
    }
}

Esta solución actual está funcionando, pero me gustaría evitar que se ejecute el catch y llamar a enableFilter solo cuando se llama a un método de mi repo.

Por cierto, tuve que hacer estos trucos porque tener …

@PersistenceUnit(unitName = "mySecondDb")
EntityManagerFactory emf;

// O

@PersistenceContext(unitName = "mySecondDb")
EntityManager em;

… no funcionaba 🙁

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para fusionar los dos puntos de corte, puede cambiar el punto de corte createEntityManager() para incluir javax.persistence.EntityManager en lugar de javax.persistence.EntityManagerFactory+. Entonces, puede agregar una condición al método enableFilter() para verificar si la llamada actual del método es desde la clase MyRepo usando jp.getTarget().getClass().equals(MyRepo.class). Aquí hay una versión modificada del código:

    @Pointcut("execution(* com.package.repository.MyRepo.*(..))")
    public void insideRepository() {}
    
    @Pointcut("execution(* javax.persistence.EntityManager.createEntityManager(..))")
    public void createEntityManager() {}
    
    @Before("insideRepository() && createEntityManager()")
    public void enableFilter(JoinPoint jp) {
        if (jp.getTarget().getClass().equals(MyRepo.class)) {
            System.out.println("En el repositorio");
            EntityManager entityManager = (EntityManager) jp.proceed();
            try {
                entityManager.unwrap(Session.class).enableFilter("myFilter");
            } catch (Exception e) {
                System.out.println("No hay filtro myFilter para esta entidad");
            }
        }
    }
    

    Este código verifica si la llamada actual del método es desde la clase MyRepo antes de habilitar el filtro en EntityManager. Si la llamada del método no es desde MyRepo, el punto de corte continúa con el comportamiento original sin habilitar el filtro.

Comments are closed.