0

我正在运行一个函数,它遍历声明的字段,找到一个对象的 2 个实例之间的差异并将其输出(用于审计跟踪)。但是,如果我使用从休眠会话加载的对象,IE:

HazardSubmission hs = (HazardSubmission)s.load(HazardSubmission.class, id);

该对象的声明字段出现在:default_interceptor,handler,_filter,methods 如果我在不使用 session.load 的情况下加载相同类型的对象,它会发现 ACTUAL 声明的字段很好。如果我在这个 hs 对象上运行 getClass().toString(),它会返回:

class nz.co.g.hs.stripes.model.HazardSubmission_$$_javassist_1

据我所知,javaasssist_1 是问题所在,由于某种原因,它没有找到实际的类。

知道我能做什么吗?

4

1 回答 1

3

session.load(HazardSubmission.class, 1)HazardSubmission.class将首先检查当前会话中是否可以找到 ID 为 1的类型的实例。如果是,则返回该实例。否则,将返回一个代理。

代理是通过子类化动态创建的HazardSubmission.class。它们不是HazardSubmission.class,这就是为什么getDeclaredFields()返回的实例不是实际FieldHazardSubmission.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());
}
于 2012-04-16T06:35:12.780 回答