【问题标题】:How to access rows with composite keys in Grails?如何在 Grails 中使用复合键访问行?
【发布时间】:2019-07-11 17:16:37
【问题描述】:

我正在使用脚手架为 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']
    }
}

一切正常,您可以通过列表视图中的自动生成链接以及config/<view>/<ID> 形式的显式 URL 访问给定行的脚手架视图,只要我有一个包含复合的表像这样的键:

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']
    }
}

...您无法再访问这些行(或者我不知道如何)。脚手架不再生成指向列表视图中视图的链接,并尝试通过像 aliasFrequencyDict/show/0/D/PL 之类的 URL 访问它(这将是 /<view>/<frequency>/<unit>/<lang>,就像在复合 id 的定义中指定的那样)会导致 404。

使用复合 ID 时如何访问相关的节目、编辑等页面?

【问题讨论】:

标签: java grails grails-orm grails-3.0 grails3


【解决方案1】:

使用 复合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 步所示:grailsframework.blogspot.com/2008/05/…),我相信,与您在此处显示的效果基本相同。但是,问题在于,即使这些方法使showedit 正常工作,实际上修改记录也不起作用——我在尝试更新这样的复合ID 行时得到AliasFrequencyDict not found with id null。我怎样才能使所有这些都正常工作?
  • 对更新做同样的事情。添加一个 url 映射,将 PUT 请求与将执行更新的控制器操作相关联,提供主键片段作为 URL 片段或表单参数,让 update 操作检索实例(类似到show),然后用表单参数的值更新实例。
  • 天哪,这听起来相当复杂 :( 不过会尽力而为,谢谢!
  • “哦,天哪,这听起来相当复杂”——我不认为它会很复杂。更新操作将包含 3 或 4 行代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-31
  • 1970-01-01
相关资源
最近更新 更多