1

我有三个实现复合模式的类:Item、Cluster 和 Element。

class Item extends Locatable {
  ...
}

class Cluster extends Item {

    static hasMany = [items:Item]

  ...
}

class Element extends Item {
  ...
}

我的域模型比这更复杂,但这只是一个例子。当我有一个 Item 实例并且我想知道它是 Cluster 还是 Element 时,ins.getClass().getSimpleName()我得到了一个奇怪的类名:Item_$$_javassist_165,如果我这样做,println ins.toString()我会打印出正确的类名(toString方法返回this.getClass().getSimpleName())。

如何获得正确的类名?这个"Item_$$_javassist_165"类名是什么?

4

3 回答 3

5

这个"Item_$$_javassist_165"类名是什么?

这意味着您拥有的对象是 Hibernate 延迟加载代理。当您第一次尝试访问该对象的 id 以外的任何内容时,Hibernate 将转到数据库并加载真实数据,然后将任何未来的方法调用委托给真实对象。

ins instanceof Cluster当您有一个扩展另一个域类的域类时,在存在代理的情况下,显而易见的方法可能无法正常工作,但 GORM 提供了一个注入的instanceOf 方法,它可以满足您的需要并正确处理代理。

if(ins.instanceOf(Cluster)) { .... }
于 2013-08-21T12:33:59.140 回答
2

You can use GrailsHibernateUtil.unwrapIfProxy(object) to receive the original object instance from a proxy object. After unwrapping you should be able to get the real class name with getClass().getSimpleName(). Be aware that you loose features like lazy loading on the unwrapped object.

于 2013-08-21T13:55:39.643 回答
0

我找到了一个给出真实姓名的方法:

org.hibernate.Hibernate.getClass(ins).getSimpleName()
于 2013-08-21T12:44:34.437 回答