java - Hibernate 和 AspectJ 字段访问

标签 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;
    }
}

当查看我的跟踪时,我可以看到对字段的任何访问都被方面拦截,除非该对象由 Hibernate 在 createEmployee 方法中保留。这肯定是因为反射。所以我想知道如何让它也与 hibernate 一起工作。

最佳答案

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

作为一个 Hibernate 用户,我无法对如何使用该工具说任何明智的话,但我强烈认为一定有一种比我刚才描述的更好、更规范的方法来实现你想要的。请分享一些代码,不要只描述什么不起作用,而是描述你想要实现的目标。我非常有信心一些 Hibernate 极客能够为您提供更优雅的解决方案。尽管我很喜欢 AspectJ,但它并不是解决所有问题的唯一方法。

关于java - Hibernate 和 AspectJ 字段访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27777474/

相关文章:

java - Android Marshmallow 6.0 webview 在运行时请求权限位置

java - 如何将ArrayList中的元素分组并分成三个List

java - Spring AOP 切入点

java - 来自 MongoDB 的警报

java - JPA/hibernate : How to pass value in @where clause

java - 强制具有 AllocationSize 的 TableGenerator 跳到下一个间隔

java - Hibernate:如何急切地获取未关联的实体?

java - 方面破坏特定类上的字节码

maven - 开普勒中的生命周期未涵盖 aspectj-maven-plugin

java - 为什么 JVM 不简单地终止而不是抛出 OOME?