Hibernate session.load()不能使用Java反射getDeclaredFields?

时间:2012-04-16 05:56:06

标签: java hibernate reflection

我正在运行一个遍历声明字段的函数,找到对象的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是问题所在,由于某种原因,它找不到实际的类。

知道我能做什么吗?

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());
}