我有三个实现复合模式的类,Item,Cluster和Element。
class Item extends Locatable {
...
}
class Cluster extends Item {
static hasMany = [items:Item]
...
}
class Element extends Item {
...
}
我的域模型比这更复杂,但它只是一个例子。
当我有一个Item实例时,我想知道它是一个群集还是一个带有ins.getClass().getSimpleName()
的元素我得到一个奇怪的类名:Item_$$_javassist_165
,如果我做println ins.toString()
我打印了正确的类名(toString
方法返回this.getClass().getSimpleName()
)。
如何获得正确的班级名称?这个"Item_$$_javassist_165"
班级名称是什么?
答案 0 :(得分:5)
这个
"Item_$$_javassist_165"
班级名称是什么?
这意味着你拥有的对象是一个Hibernate延迟加载代理。第一次尝试访问除该对象id之外的任何内容时,Hibernate将转到数据库并加载实际数据,然后将任何将来的方法调用委托给真实对象。
当有一个域类扩展另一个域时,ins instanceof Cluster
的明显方法可能无法在代理存在的情况下正常工作,但GORM提供了一个注入instanceOf method,它可以满足您的需要并处理代理正确。
if(ins.instanceOf(Cluster)) { .... }
答案 1 :(得分:2)
您可以使用GrailsHibernateUtil.unwrapIfProxy(object)
从代理对象接收原始对象实例。解包后,您应该能够使用getClass().getSimpleName()
获取真正的班级名称。请注意,您松开了未打开对象上的延迟加载等功能。
答案 2 :(得分:0)
我找到了一个给出真实姓名的方法:
org.hibernate.Hibernate.getClass(ins).getSimpleName()