net*_*ain 4 mysql grails groovy hibernate
所以我知道使用超类是可能的,但是,这在灵活性上非常有限。所以我的问题是,我可以使用接口吗?有事啊。
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)
}
}
Run Code Online (Sandbox Code Playgroud)
我对返回具有以下标签的对象的引用感兴趣。然而,这个对象不能扩展一个具体的类。这就是为什么我想知道这是否可以用接口来完成。
那么,可以做到吗?
Hibernate 可以映射一个接口——参见示例。我怀疑 Grails 在按约定映射中是否支持这一点 - 但您可以尝试使用上面示例中的映射注释或 XML 配置。
编辑:回答评论问题:
在数据库级别,您必须有一个Taggable表供Tag.References外键引用。
鉴别器不会打败多态性,如果它是自动添加的——例如,在每个层次结构的表映射中,Hibernate/Gorm 添加一个class字段,以便在从 db 读取对象时找出具体的类。
如果你将你的Taggables映射到两个表 -Taggable部分到Taggable特定表,其他所有表,引用 1:1 - 所有鉴别器工作都应该由 Hibernate 为你完成。
BTWclass字段很长——它包含完全限定的类名。
编辑 2:无论哪种方式,它都变得非常复杂,我个人会采用我在另一个问题中建议的方法:
hasMany=[tags:Tag]属性;