2010-05-17 90 views
1

我必须在我的Grails应用程序中实现地图值。 我有一个类可以包含0..N OsmTags,而且这个键是唯一的。 在Java中,我会用每个对象中的Map来建模,但我不知道如何映射Grails中的类。在Grails中建模地图值的最佳方法是什么?

所以我定义这个类:

class OsmTag { 
    /** OSM tag name, e.g. natural */ 
    String key 
    /** OSM tag value, e.g. park */ 
    String value 

    static constraints = { 
     key blank:false, size:2..80,matches:/[\S]+/, unique:false 
     value blank:false, size:1..250,matches:/[\S]+/, unique:false 
    } 
} 

这工作不错,但它实际上是相当难看,因为标签的关键不是唯一的。 有没有更好的方法来模拟这个问题?

干杯

回答

0

如果我正确理解你的问题,那么你要确保每个标签是标签实体的特定实例中是唯一的?

假设实体被附上的标签被命名为Taggable,然后 您可以使用自定义的约束强制执行此规定:

class Taggable { 
    static hasMany = [ tags: OsmTag ] 
} 

class OsmTag { 

    static belongsTo = [ taggable: Taggable ] 

    /** OSM tag name, e.g. natural */ 
    String key 
    /** OSM tag value, e.g. park */ 
    String value 

    static constraints = { 
     key(blank:false, size:2..80,matches:/[\S]+/, unique:false, 
      validator: { val, obj -> 
       if (obj.taggable.tags.key.count(val > 1)) { 
        return false 
       } 
      } 
     ) 

     value(blank:false, size:1..250,matches:/[\S]+/, unique:false) 
    } 
} 
+0

是的,这好多了! 谢谢 – Mulone 2010-05-17 16:14:24

2

如果你的标签是简单的字符串,那么你可以使用一个map directly

class Taggable { 
    Map tags // key : String, value : String 
} 
相关问题