我最近将我的grails 3.2.10应用程序从hibernate 4(GORM 6.1.3)升级到hibernate5(GORM 6.1.8)。通过这次升级,我开始从代理对象中看到一些奇怪的(不正确的?)行为,我想知道我是否做错了什么。这是一个示例摘录,用于说明问题,(我意识到这对于Enums来说并不理想,但那是我与之合作的内容):
域类:
package com.test
class Socket {
String name
SocketType socketType //This is an enum
}
package com.test
class ElectricalOutlet extends Socket {
Double maxOutput
SocketType socketType = SocketType.ELECTRICAL
}
使用它的服务类代码导致问题。除getSockets()
懒惰地加载套接字列表外,实现细节并不重要。同样,在这种情况下并不理想,但这一直在hibernate4下工作。
def doSomethingWithOutlets(someKey) {
def sockets = someOtherService.getSockets(someKey)
sockets.each {
if(it.socketType == SocketType.ELETRICAL) {
println("Class: ${it.class.name}")
println("Output: ${it.maxOutput}")
}
}
}
打印maxOutput
时出错No such property: maxOutput for class: com.test.Socket
班级println显示Class: com.test.Socket_$$_jvst4ae_2
。
如果我在打印语句之前添加it = GrailsHibernateUtil.unwrapIfProxy(it)
,我会得到正确的com.test.ElectricalOutlet
和Output: blahblah
。
另请注意,如果我尝试强制转换Proxy类,则会失败并显示ClassCastException
我是否遗漏了某些内容,或者代理类是否能够像过去一样解析具体类的属性?我需要在整个代码中显式处理代理类似乎是不正确的。