【问题标题】:Hibernate and AspectJ field accessHibernate 和 AspectJ 字段访问
【发布时间】:2015-01-05 10:20:58
【问题描述】:

我有一个与拦截休眠字段访问有关的问题。在 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一起使用。

【问题讨论】:

  • 一些自洽的示例代码可以重现您的问题,最好是 SSCCE 此处或 GitHub 上,将帮助社区更好地回答您的问题。 StackOverflow 是关于代码的。 ;-) 这样我就可以提供一个非常笼统的答案。
  • 你的方面除了记录字段访问之外什么都不做。这几乎不可能是你真正的用例。为什么你会对知道 Hibernate 访问你的字段感兴趣?为了坚持他们,我当然必须这样做。您真正想要达到什么目标?
  • 我希望能够在hibernate访问之前修改字段值
  • 正如我所说,我是一个 Hibernate 菜鸟,从未使用过它。但是快速的网络搜索显示在 Hibernate 中有interceptors 的概念。使用其中一个作为钩子以便在保存之前完成您的属性怎么样?
  • 当我使用 JPA 时,我想我会使用 PrePersist 作为监听器。

标签: java hibernate aspectj


【解决方案1】:

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

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

【讨论】:

  • 谢谢。我添加了一个简单的代码 sn-p。希望这会有所帮助。
猜你喜欢
  • 2010-11-09
  • 2016-05-12
  • 2020-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-08
相关资源
最近更新 更多