多态属于Grails中的多对多映射?

时间:2011-05-08 09:13:26

标签: 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<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)
  }
}

我感兴趣的是对具有以下标记的对象的引用。但是,该对象不能扩展具体类。这就是为什么我想知道是否可以用接口来完成。

那么,可以吗?

1 个答案:

答案 0 :(得分:4)

Hibernate可以映射界面 - see example。我怀疑Grails是否支持按惯例映射 - 但您可以尝试使用上面示例中的映射annotations或XML配置。

修改:回答评论问题:

在数据库级别,您必须使用Taggable Tag.References表来引用外键。

  1. 判别器不会破坏多态性,如果它是自动添加的 - 例如,在每层次表映射中,Hibernate / Gorm会添加一个class字段,以便在读取对象时找出具体的类来自db。

  2. 如果您将Taggable映射到两个表 - Taggable部分到Taggable以及其他所有特定表格,参考1:1 - 所有鉴别工作都应该是由Hibernate为您完成。

  3. BTW class字段非常长 - 它包含完全限定的类名

    编辑2 : 无论哪种方式,它都变得非常复杂,我个人会采用我建议的方法in another question

    • 使用Taggable接口为hasMany=[tags:Tag]属性动态查询所有类;
    • 或者,不太可取 - 有一个手工制作的儿童桌和鉴别器。