gpt4 book ai didi

java - Hibernate 和 AspectJ 字段访问

转载 作者:太空宇宙 更新时间:2023-11-04 14:15:44 25 4
gpt4 key购买 nike

我有一个与拦截 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com