Mysql grails中多对多映射中的多态性归属?

Mysql grails中多对多映射中的多态性归属?,mysql,hibernate,grails,groovy,Mysql,Hibernate,Grails,Groovy,所以我知道这是可能的使用超类,然而,这是非常有限的灵活性。那么我的问题是,我可以使用接口吗?阿拉 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<Stri

所以我知道这是可能的使用超类,然而,这是非常有限的灵活性。那么我的问题是,我可以使用接口吗?阿拉

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)
  }
}
接口标记{
/*添加标记并返回当前设置的标记列表*/
列表添加标记(字符串…标记)
/*删除标记并返回当前设置的标记列表*/
列表移除标记(字符串…标记)
}
类用户实现标记{
字符串用户名
static hasMany=[tags:Tag]
}
类标签{
字符串名
static hasMany=[references:Taggable]
静态belongsTo=Taggable
静态约束={
名称(可空:false,空白:false,唯一:true)
}
}
我感兴趣的是有以下标记的对象的引用。然而,这个对象不能扩展一个具体的类。这就是为什么我想知道这是否可以用一个接口来代替


那么,可以这样做吗?

Hibernate可以映射一个接口-。我怀疑Grails是否支持按约定映射,但您可以尝试使用上面示例中的映射或XML配置

编辑:回答评论问题:

在数据库级别上,必须为
Tag.References提供一个
Taggable
表,以便使用外键进行引用

  • 鉴别器不会破坏多态性,如果它是自动添加的——例如,在每个层次的表映射中,Hibernate/Gorm添加了一个
    class
    字段,以便在从db读取对象时找到一个具体的类

  • 如果将
    Taggable
    s映射到两个表-
    Taggable
    部分映射到
    Taggable
    ,其他所有映射到特定表,参考1:1-所有鉴别器工作都应由Hibernate为您完成

  • 顺便说一句,class
    字段相当长-它包含完全限定的类名

    编辑2: 无论哪种方式,它都变得相当复杂,我个人赞同我建议的方法:

    • 使用Taggable接口动态查询所有类,查找
      hasMany=[tags:Tag]
      property
    • 或者,更不可取的是,有一个手工制作的子表和一个鉴别器

    是的,你可能是对的,我不认为我可以使用grails-gorm映射来实现这一点。然而,在您的示例中,我似乎需要在注释中添加鉴别器,并引用特定的类,这在一定程度上违背了多态性的目的。而且还降低了
    标记
    实现的灵活性。。。所以问题变成了,一个没有鉴别器的映射能不能在代码中需要类引用?XML总是一个选项,这样我们就不会在源代码中引用实现类。。。但是现在谁喜欢XML呢?很抱歉没有给出一个片段——这将花费太长的时间。只是一个尝试的原始想法。注释仍然可以工作,而且人们确实使用XML来实现对不同DBMS的不同映射。一个附带的问题:你说
    字段很长,我认为这是一个否定的东西?类字段本身是否有性能损失?这就是为什么使用三个字母鉴别器的原因吗?难道不能索引类字段或以任何方式优化它吗?(加入表格?)我刚刚想到了另一个可能的解决方案。也许有了groovy的强大功能,就可以通过编程方式添加数据库映射了?伪代码:查找实现标记的所有域类。为
    标记上的每个类添加@MetaValue。(哦,顺便说一句,很抱歉把你的脑子挖到这个地步:))