grails中多对多映射中的多态belongsTo?

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)

我对返回具有以下标签的对象的引用感兴趣。然而,这个对象不能扩展一个具体的类。这就是为什么我想知道这是否可以用接口来完成。

那么,可以做到吗?

Vic*_*nko 5

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

编辑:回答评论问题:

在数据库级别,您必须有一个Taggable表供Tag.References外键引用。

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

  2. 如果你将你的Taggables映射到两个表 -Taggable部分到Taggable特定表,其他所有表,引用 1:1 - 所有鉴别器工作都应该由 Hibernate 为你完成。

BTWclass字段很长——它包含完全限定的类名

编辑 2:无论哪种方式,它都变得非常复杂,我个人会采用我在另一个问题中建议的方法:

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