我正在运行一个遍历声明字段的函数,找到对象的2个实例之间的差异并输出它(对于审计跟踪)。但是,如果我使用从hibernate会话加载的对象,I.E:
HazardSubmission hs = (HazardSubmission)s.load(HazardSubmission.class, id);
该对象的声明字段来自:default_interceptor,handler,_filter,方法,如果我在不使用session.load的情况下加载相同类型的对象,则会发现ACTUAL声明字段正常。如果我在这个hs对象上运行getClass()。toString(),它将返回:
class nz.co.g.hs.stripes.model.HazardSubmission_$$_javassist_1
据我所知,javaasssist_1是问题所在,由于某种原因,它找不到实际的类。
知道我能做什么吗?
答案 0 :(得分:3)
session.load(HazardSubmission.class, 1)
将首先检查当前会话中是否可以找到ID为1的HazardSubmission.class
类型的实例。如果是,则返回该实例。否则,将返回代理。
代理是通过对HazardSubmission.class
进行子类化动态创建的。它们不是HazardSubmission.class
,这就是为什么返回的实例上的getDeclaredFields()
不是实际的Field
HazardSubmission.class
要从生成的代理实例中获取实际Class
,您可以使用Hibernate.getClass()
HazardSubmission hs = (HazardSubmission)s.load(HazardSubmission.class, id);
System.out.println(Hibernate.getClass(hs).toString());
for (Field field : Hibernate.getClass(hs).getDeclaredFields()) {
System.out.println(field .toString());
}