我有三个实现复合模式的类,Item,Cluster和Element.
class Item extends Locatable {
...
}
class Cluster extends Item {
static hasMany = [items:Item]
...
}
class Element extends Item {
...
}
Run Code Online (Sandbox Code Playgroud)
我的域模型比这更复杂,但它只是一个例子.当我有一个Item实例时,我想知道它是一个簇还是一个元素,ins.getClass().getSimpleName()
我得到一个奇怪的类名:Item_$$_javassist_165
如果我这样做,println ins.toString()
我会打印出正确的类名(toString
方法返回this.getClass().getSimpleName()
).
如何获得正确的班级名称?这个"Item_$$_javassist_165"
班级名字是什么?
这个
"Item_$$_javassist_165"
班级名字是什么?
这意味着你拥有的对象是一个Hibernate延迟加载代理.第一次尝试访问除该对象的id之外的任何内容时,Hibernate将转到数据库并加载实际数据,然后将任何将来的方法调用委托给真实对象.
ins instanceof Cluster
当您有一个扩展另一个域类的域类时,明显的方法可能无法在代理存在的情况下正常工作,但GORM提供了一个注入的instanceOf方法,它可以执行您需要的操作并正确处理代理.
if(ins.instanceOf(Cluster)) { .... }
Run Code Online (Sandbox Code Playgroud)