Grails/Groovy域类继承转换

Grails/Groovy域类继承转换,grails,inheritance,groovy,gorm,Grails,Inheritance,Groovy,Gorm,我已经在Grails中使用继承为我的域类建模,如下所示 abstract class Profile{ } class Team extends Profile{ } class User extends Profile{ } class B{ static hasMany = [profiles: Profile] } 稍后在控制器中,当我从类B获取所有概要文件时,在某些情况下,我希望将一些概要文件强制转换为团队或用户,但我不能,因为我得到了java.lang.ClassCas

我已经在Grails中使用继承为我的域类建模,如下所示

abstract class Profile{
}

class Team extends Profile{
}

class User extends Profile{
}

class B{
    static hasMany = [profiles: Profile]
}
稍后在控制器中,当我从类B获取所有概要文件时,在某些情况下,我希望将一些概要文件强制转换为团队或用户,但我不能,因为我得到了java.lang.ClassCastException或GroovyCastException,尽管它们保存为团队或用户(在数据库中带有属性类)。以下是我尝试过的方法:

def team1 = b.profiles.toList()[0] as Team

def team1 = (Team)b.profiles.toList()[0]
当我不写任何类型时,它就可以工作了,只需使用它,因为它在动态语言中是正常的

def team1 = b.profiles.toList()[0]

但我永远不知道我在用哪一类。groovy或gorm中是否有将父类强制转换为子类的方法?

答案是,因为真正的gorm/Hibernate实例是一个代理对象。因此它不能直接转换为实体类

无论如何,这可能会有帮助:

def team1 = b.profiles.toList()[0]
if(team1.instanceOf(Team)) {
    // I am an instance of Team
    // do something here.
}

gorm无法在
用户
团队
之间进行选择。gorm应该如何决定使用哪个实现?它保存到数据库中的同一个表中,并带有一个class属性,该属性指示它是哪个类。它正在工作,但实际上这不是我的问题。我的问题是,是否有办法将基类显式转换为子类。没有,因为hibernate代理不一定是Java意义上的子类的
实例。代理类是声明的
b.profiles
(即
Profile
)类型的动态生成的子类。有血淋淋的细节,它(以及同一系列中的其他文章)非常值得一读。总是有
grailshbernateutil.unwapifproxy
,它将删除代理包装器并为您提供真实的对象(您可以强制转换),但如果真实的对象尚未加载,则必须对数据库执行此操作。