所以我知道使用超类是可能的,但是,这在灵活性方面非常有限。所以我的问题是,我可以使用接口吗?唉。
interface Taggable {
/*Adds tag(s) and returns a list of currently set tags*/
List<String> addTags(String ... tag)
/*Removes tag(s) and returns a list of currently set tags*/
List<String> removeTags(String ... tag)
}
class User implements Taggable {
String username
static hasMany = [tags:Tag]
}
class Tag {
String name
static hasMany = [references:Taggable]
static belongsTo = Taggable
static constraints = {
name(nullable: false, blank: false, unique: true)
}
}
我对引用具有以下标签的对象感兴趣。但是,此对象不能扩展具体类。这就是为什么我想知道这是否可以用接口来完成。
那么,能做到吗?
Hibernate可以映射一个接口 - 参见示例。我怀疑 Grails 是否在按约定映射中支持这一点 - 但您可以尝试使用上面示例中的映射注释或 XML 配置。
编辑:回答评论问题:
在数据库级别,您必须有一个Taggable
表,以便Tag.References
使用外键进行引用。
-
如果鉴别器是自动添加的,它不会击败多态性 - 例如,在每层次结构表映射中,Hibernate/Gorm 添加一个
class
字段,以便在从数据库读取对象时找出一个具体的类。 -
如果您将
Taggable
映射到两个表 -Taggable
部分映射到Taggable
,其他所有内容映射到特定表,引用 1:1 - 所有鉴别器工作都应由Hibernate为您完成。
顺便说一句class
字段很长 - 它包含完全限定的类名。
编辑2:无论哪种方式,它都变得非常复杂,我个人会采用我在另一个问题中建议的方法:
- 动态查询所有具有可标记接口的类以获取
hasMany=[tags:Tag]
属性; - 或者,不太可取 - 有一个手工制作的子表和一个鉴别器。