【发布时间】: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 作为监听器。