Hibernate和AspectJ字段访问

时间:2015-01-05 10:20:59

标签: java hibernate aspectj

我有一个与拦截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一起工作。

1 个答案:

答案 0 :(得分:0)

如果set() / get()切入点由于反射不起作用 - 您是否真的通过Hibernate源代码检查或调试验证了您的假设? - 您只能通过将方面代码编织到Hibernate中进行字段访问的部分来间接解决问题。这可以通过编译时的二进制编织来完成,创建Hibernate库的方面增强版本,或者在运行时通过加载时编织动态创建。

不是Hibernate用户,我不能说你应该如何使用该工具,但我强烈认为必须有一种更好,更规范的方式来实现你想要的东西,而不是我刚刚描述的。请分享一些代码,不要只描述什么不起作用,而是描述你想要实现的目标。我非常有信心,一些Hibernate geek将能够为您提供更优雅的解决方案。尽管我喜欢AspectJ,但它并不是解决所有问题的唯一方法。