gpt4 book ai didi

grails - 无法更改 Grails 中的域类属性值

转载 作者:行者123 更新时间:2023-12-02 14:02:07 24 4
gpt4 key购买 nike

我正在开发 Grails 2.3.7 应用程序,我在使用选择框更改域属性时遇到问题。每次我尝试更改属性并保存时,我都会得到 HibernateException: identifier of an instance of Ethnicity was altered from X to Y .我不想改变种族的ID,我只想改变ApplicationPerson s 种族从一个到另一个。

需要注意的几点:

  • 我正在使用相同的 Controller 操作来创建和更新此人。
  • 设置personInstance.ethnicitynull就在 personInstance.properties = params 之前将使保存工作,但我
    不知道为什么,我不想为每个协会都这样做
    我想改变。
  • 我意识到域模型似乎很奇怪。这是一个我无法更改的遗留数据库。

  • 这是我的域类:
    class ApplicationPerson implements Serializable {
    Integer appId
    Integer applicationSequenceNumber
    String firstName
    String lastName
    Ethnicity ethnicity

    static mapping = {
    id composite: ['appId', 'applicationSequenceNumber'],
    generator: 'assigned'
    }
    }

    class Ethnicity {
    String code
    String description

    static mapping = {
    id name: 'code', generator: 'assigned'
    }
    }

    这是我的 _form.gsp更新 Ethnicity (我删除了所有其他保存得很好的属性):
    <div class="fieldcontain ${hasErrors(bean: personInstance, 
    field: 'ethnicity', 'error')} ">
    <label for="ethnicity">Ethnicity</label>
    <g:select id="ethnicity"
    name="ethnicity.code"
    from="${Ethnicity.list()}"
    optionKey="code"
    value="${personInstance?.ethnicity?.code}" />
    </div>

    最后,表单发布到的我的 Controller 操作:
    def save() {
    Application app = applicationService.getCurrentApplication()

    // Find/Create and save Person
    ApplicationPerson personInstance = app.person
    if (!personInstance) {
    personInstance =
    new ApplicationPerson(appId: app.id,
    applicationSequenceNumber: app.sequenceNumber)
    }
    personInstance.properties = params

    if (!personInstance.validate()) {
    respond personInstance.errors, view:'edit'
    return
    }

    personInstance.save flush:true
    redirect action: 'list'
    }

    最佳答案

    修改select中的名称来自 ethnicity.code 的元素至personInstance.etnicity.code如下所示:

    <g:select id="ethnicity" 
    name="personInstance.ethnicity.code"
    from="${Ethnicity.list()}"
    optionKey="code"
    value="${personInstance?.ethnicity?.code}" />

    所选选项的名称绑定(bind)到 params作为键和选定的值作为 value对着 key 。使用 ethnicity.code将尝试修改现有 ethnicity 的主键而不是修改申请者的种族。

    更新
    上面的名称更改是可选的(可以在您不需要 params 被分配为域类的属性的情况下使用)。曾用名 ethnicity.code应该也可以工作,但 Controller 操作中还需要进行以下更改才能设置种族:
    //or use params.ethnicity.code
    //if name is ethnicity.code
    person.ethnicity = Ethnicity.load(params.personInstance.ethnicity.code)

    //or use params if name is ethnicity.code
    person.properties = params.personInstance

    加载现有的 Ethnicity基于传入的 code然后设置在 person在设置属性之前。

    问题在于 codeEthnicity 的主键.如果 Ethnicity有一个单独的标识列(例如,默认的 Long id ),那么您的确切实现将在数据绑定(bind)的帮助下工作。但是由于提到您正在使用旧数据库,我想您将无法修改表来为 id 添加另一列.所以你最好的选择是 load (与获取相比便宜,因为行是从休眠缓存中加载的)来自传入代码的种族,然后将其设置为人。

    如果可能,您还可以看到尝试缓存 Ethnicity 域,因为这将是主数据并且是缓存的良好候选者。

    关于grails - 无法更改 Grails 中的域类属性值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23045599/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com