i want to create aspect that will cover soft delete functionality. hibernate filter works flawlessly with jpa, here is the sample code.
@Service
@AllArgsConstructor
public class BlogPostServiceImpl implements BlogPostService {
private BlogPostRepository blogPostRepository;
private BlogPostResponseMapper blogPostResponseMapper;
@PersistenceContext
public EntityManager entityManager;
@Transactional
@Override
public BlogPostResponse getBlogPostById(UUID id) {
Session session = entityManager.unwrap(Session.class);
session.enableFilter(SOFT_DELETE_FILTER);
BlogPost blogPost = blogPostRepository.findById(id)
.orElseThrow(()->new ResourceNotFoundException("Blog post not found"));
session.disableFilter(SOFT_DELETE_FILTER);
return blogPostResponseMapper.modelToDto(blogPost);
}
}
when i try to use it with aspect, the aspect is running but the filter’s condition is not added into the query.
service
@Service
@AllArgsConstructor
public class BlogPostServiceImpl implements BlogPostService {
private BlogPostRepository blogPostRepository;
private BlogPostResponseMapper blogPostResponseMapper;
@PersistenceContext
public EntityManager entityManager;
@Transactional
@Override
public BlogPostResponse getBlogPostById(UUID id) {
BlogPost blogPost = blogPostRepository.findById(id)
.orElseThrow(()->new ResourceNotFoundException("Blog post not found"));
return blogPostResponseMapper.modelToDto(blogPost);
}
}
aspect
@Slf4j
@Aspect
@Component
@Order(0)
public class SoftDeleteAspect {
@Before("execution(* com.sample.cms.service..*.*(..))")
public void beforeExecution(JoinPoint joinPoint) throws Throwable {
Class<?> classAspect = joinPoint.getTarget().getClass();
Field[] fields = classAspect.getDeclaredFields();
for (Field field : fields) {
if (StringUtils.equals("entityManager", field.getName())) {
field.setAccessible(true);
EntityManager entityManager = (EntityManager) field.get(joinPoint.getTarget());
Session session = entityManager.unwrap(Session.class);
session.enableFilter(SOFT_DELETE_FILTER);
}
}
}
@After("execution(* com.sample.cms.service..*.*(..))")
public void afterExecution(JoinPoint joinPoint) throws Throwable {
Class<?> classAspect = joinPoint.getTarget().getClass();
Field[] fields = classAspect.getDeclaredFields();
for (Field field : fields) {
if (StringUtils.equals("entityManager", field.getName())) {
field.setAccessible(true);
EntityManager entityManager = (EntityManager) field.get(joinPoint.getTarget());
Session session = entityManager.unwrap(Session.class);
session.disableFilter(SOFT_DELETE_FILTER);
}
}
}
}
what should i do to make it work?