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 🙁
davy.ai
Para fusionar los dos puntos de corte, puede cambiar el punto de corte
createEntityManager()
para incluirjavax.persistence.EntityManager
en lugar dejavax.persistence.EntityManagerFactory+
. Entonces, puede agregar una condición al métodoenableFilter()
para verificar si la llamada actual del método es desde la claseMyRepo
usandojp.getTarget().getClass().equals(MyRepo.class)
. Aquí hay una versión modificada del código:Este código verifica si la llamada actual del método es desde la clase
MyRepo
antes de habilitar el filtro enEntityManager
. Si la llamada del método no es desdeMyRepo
, el punto de corte continúa con el comportamiento original sin habilitar el filtro.