我有一个与拦截hibernate字段访问有关的问题。我需要在Hibernate持久化之前对字段进行一些检查。
我在考虑使用AspectJ和字段访问连接点,但这不适用于Hibernate。对字段的任何其他调用/访问都被很好地拦截,但是当被hibernate访问时却没有。
所以这在使用getter时工作正常,但如果我使用hibernate进行字段访问,这不起作用。
我认为这是因为Hibernate正在使用反射。
你认为我能拦截这个吗?
我有这样的事情:
@Entity
public class Employee {
@Id
private Long id;
private String firstName;
private String lastName;
}
和一个DAO方法
@PersistenceContext
private EntityManager entityManager;
@Transactional
public Long createEmployee(Employee employee) {
entityManager.persist(employee);
return employee.getId();
}
然后我有这样一个方面
@Aspect
public class MyAspect {
@Pointcut("get(* test.Employee.*)")
public void executionGetField() {}
@Around("executionGetField()")
public Object onGet(ProceedingJoinPoint thisJoinPoint) {
System.out.println("executionGetField " + thisJoinPoint.getSignature().getName());
Object o = null;
try {
o = thisJoinPoint.proceed();
return o;
} catch (Throwable e) {
return null;
}
}
在查看我的跟踪时,我可以看到该方面正在拦截对字段的任何访问,除非在createEmployee方法中Hibernate持久保存该对象。这当然是因为反思。所以我想知道如何让它与hibernate一起工作。
答案 0 :(得分:0)
如果set()
/ get()
切入点由于反射不起作用 - 您是否真的通过Hibernate源代码检查或调试验证了您的假设? - 您只能通过将方面代码编织到Hibernate中进行字段访问的部分来间接解决问题。这可以通过编译时的二进制编织来完成,创建Hibernate库的方面增强版本,或者在运行时通过加载时编织动态创建。
不是Hibernate用户,我不能说你应该如何使用该工具,但我强烈认为必须有一种更好,更规范的方式来实现你想要的东西,而不是我刚刚描述的。请分享一些代码,不要只描述什么不起作用,而是描述你想要实现的目标。我非常有信心,一些Hibernate geek将能够为您提供更优雅的解决方案。尽管我喜欢AspectJ,但它并不是解决所有问题的唯一方法。