我一直在使用 grails。有些东西我仍然不知道如何正确实现。
我有一个域类(比如说用户),它包含一个列表,它可能是任何域类(项目、用户等)。有没有办法让这个开箱即用?
目前我正在按照以下方式进行操作:
我有一个包含以下属性的 UserLink:
class UserLink{
User user
String className
Long refId
}
然后我有一个服务,它加载给定用户的所有链接,然后是链接中的相应对象,并将它们作为列表返回。
我认为这种方法不是最好的,并且可能会导致 future 的性能问题
你怎么看?你有更好的设计理念吗?
谢谢,
尼古拉斯
最佳答案
它真的有,还是只有某个类的子集?我相信你会有更多与用户没有直接关系的域类。
如果是这样,您可以创建一个 UserAsset
带有 belongsTo=[user: User]
的类或接口(interface)prop,并继承/实现它。
然后找到所有实现它的领域类,并用 clazz.findByUser()
查询每个类。 , 像:
GrailsClass[] classes = grailsApplication.getArtefacts('Domain')
GrailsClass[] userAssetClasses =
classes.clazz.findAll { UserAsset.class.isAssignableFrom(it) }
List<UserAsset> allUserAssets =
userAssetClasses.clazz*.findAllByUser(myUser).flatten()
编辑 : 如果我们说的是 M:M,它只会改变最后一行,即
userAssetClasses
被查询。UserAsset
将有 hasMany=[users:User]
属性(property)。像:
List<UserAsset> allUserAssets = userAssetClasses.clazz.collect{
Class domainClass ->
it.withCriteria {
users {
eq('id', myUser.id)
}
}
}.flatten()
关于hibernate - GORM : List all the domain instances belonging to User (root object),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5911990/