所以我知道这可以使用超类,但是,这在灵活性方面是非常有限的。所以我的问题是,我可以使用界面吗?东西。
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)
}
}
我感兴趣的是对具有以下标记的对象的引用。但是,该对象不能扩展具体类。这就是为什么我想知道是否可以用接口来完成。
那么,可以吗?
答案 0 :(得分:4)
Hibernate可以映射界面 - see example。我怀疑Grails是否支持按惯例映射 - 但您可以尝试使用上面示例中的映射annotations或XML配置。
修改:回答评论问题:
在数据库级别,您必须使用Taggable
Tag.References
表来引用外键。
判别器不会破坏多态性,如果它是自动添加的 - 例如,在每层次表映射中,Hibernate / Gorm会添加一个class
字段,以便在读取对象时找出具体的类来自db。
如果您将Taggable
映射到两个表 - Taggable
部分到Taggable
以及其他所有特定表格,参考1:1 - 所有鉴别工作都应该是由Hibernate为您完成。
BTW class
字段非常长 - 它包含完全限定的类名。
编辑2 : 无论哪种方式,它都变得非常复杂,我个人会采用我建议的方法in another question:
hasMany=[tags:Tag]
属性动态查询所有类;