Java 如何在Grails中使用复合键访问行?

Java 如何在Grails中使用复合键访问行?,java,grails,gorm,grails-3.0,grails3,Java,Grails,Gorm,Grails 3.0,Grails3,我正在使用scaffolding为Grails 3中的Oracle 12c DB创建一个简单的CRUD,而对于具有如下显式整数ID列的简单表: class Config { int id String name String type String value String description int status static constraints = { /* constraints constraints co

我正在使用scaffolding为Grails 3中的Oracle 12c DB创建一个简单的CRUD,而对于具有如下显式整数ID列的简单表:

class Config {
    int id
    String name
    String type
    String value
    String description
    int status

    static constraints = {
        /* constraints constraints constraints */
    }

    static mapping = {
        sort 'name'
        version false
        id column: 'CONFIGID', name:'id', generator:'sequence', params:[sequence: 'CONFIG_SEQ']
    }
}
class AliasFrequencyDict implements Serializable{
    String frequency
    String unit
    String description
    String lang

    static constraints = {
        /* constraints constraints constraints */
    }

    static mapping = {
        sort 'frequency'
        version false
        id composite: ['frequency', 'unit', 'lang']
    }
}
一切正常,您可以通过列表视图中自动生成的链接以及config//形式的显式URL访问给定行的框架视图,只要我有一个具有如下组合键的表:

class Config {
    int id
    String name
    String type
    String value
    String description
    int status

    static constraints = {
        /* constraints constraints constraints */
    }

    static mapping = {
        sort 'name'
        version false
        id column: 'CONFIGID', name:'id', generator:'sequence', params:[sequence: 'CONFIG_SEQ']
    }
}
class AliasFrequencyDict implements Serializable{
    String frequency
    String unit
    String description
    String lang

    static constraints = {
        /* constraints constraints constraints */
    }

    static mapping = {
        sort 'frequency'
        version false
        id composite: ['frequency', 'unit', 'lang']
    }
}
。。。你不能再访问这些行了,或者我不知道如何访问。Scaffolding不再生成指向列表视图中视图的链接,并尝试通过类似aliasFrequencyDict/show/0/D/PL的URL访问它,这与复合id的定义中指定的///完全相同,结果是404

使用复合ID时,如何访问相关的显示、编辑等页面

在使用时,如何访问相关的显示、编辑等页面 复合ID

有很多方法可以做到这一点。例如,对于show,您可以有一个URL映射,看起来像这样

"/aliasFreqDict/$freq/$unit/$language"(controller: 'aliasFreqDict', action: 'show')
然后有一个相应的控制器动作

class AliasFreqDictController {

    AliasFreqService aliasFreqService

    def show(String freq, String unit, String language) {
        // have a service method that looks up the instance by these properties...
        respond aliasFreqService.find(freq, unit, language)
    }
}

我希望这会有所帮助。

这可能是脚手架的一个局限性,我想您需要为这个特定的域生成视图,并根据您的需求进行修改。文档确实声明不建议使用复合键。请注意,我使用了language作为请求参数名。我知道您有一个名为lang的属性,这很好,但您不想将lang用作请求参数,因为我们在框架中内置了区域设置切换功能,它使用了一个同名参数。哦,我明白了,这很有意义,非常感谢!我确实走了一条稍有不同的路线,并在控制器中添加了一种适当重定向的方法,如第5步所示:我相信,这种方法的效果与您在这里展示的大致相同。但是,问题是,即使这些方法使show或edit正常工作,实际上修改记录也不起作用-在尝试更新这样一个复合id行时,我得到了一个id为null的AliasFrequencyDict。我如何使所有这些也正常工作?对更新也做同样的事情。添加一个url映射,该映射将PUT请求与将执行更新的控制器操作相关联,提供主键片段作为url片段或表单参数,让更新操作检索类似于show的实例,然后使用表单参数的值更新实例。哦,天哪,这听起来相当复杂:我会尽我最大的努力,谢谢!哦,天哪,这听起来相当复杂——我认为不会很复杂。更新操作将包含3或4行代码。